Я столкнулся с этим вопросом на платформе кодирования Дана одна единственная таблица. Он имеет следующий формат:
Температурные_записи
Таблица состоит из показаний минимальной, максимальной и средней температуры за каждый день за шесть месяцев 2020 года. Нам необходимо рассчитать месячную минимальную, среднемесячную, месячную максимальную температуру. Вывод должен быть таким: (Минимальная, максимальная и средняя температуры должны быть округлены до ближайшего целого числа)
Теперь я использовал следующий запрос:
select table1.month, table1.data_type, table1.data_value
from (
select substring(record_date, 6, 2) as "month", data_type, data_value
from temperature_records
) table1
order by table1.month, table1.data_type;
Этот запрос дает мне результат, который выглядит следующим образом:
Возвращает помесячные записи Теперь, если я группирую записи по (месяц, тип_данных), мне нужно выполнить функцию агрегирования записей в зависимости от их типа_данных. Как мне это сделать? Кроме того, как я могу вернуть записи в соответствии с желаемым форматом вывода?
Вы храните даты в столбце char/varchar?!? Вместо этого используйте правильный тип данных.
Нет необходимости задействовать год? Что произойдет, если в вашей таблице будут данные за период более одного года?
Проблема на платформе кодирования хранила дату в столбце varchar. Я должен был принять во внимание год. Но учитывая, что в таблице были данные только за 2020 год. Мне нужно было решить задачу до того, как у меня закончится время, поэтому я сосредоточился только на месяце @jarlh
@gollapudisravani Если вас не волнуют годы, используйте запрос в этого ответа . Если вам также необходимо сгруппировать данные по годам, расширьте запрос. Проверьте этот образец скрипта, чтобы увидеть разницу.
Здесь мы можем использовать условную агрегацию для общего решения:
SELECT
MONTH(Record_date) AS Month,
MAX(CASE WHEN Data_type = 'min' THEN Data_value END) AS Min,
MAX(CASE WHEN Data_type = 'max' THEN Data_value END) AS Max,
MAX(CASE WHEN Data_type = 'avg' THEN Data_value END) AS Avg
FROM temperature_records
GROUP BY 1
ORDER BY 1;
Спасибо за ответ. Задаю этот вопрос только для того, чтобы подтвердить, что я правильно понял код: Итак, мы группируем записи temp_records по месяцам, а затем выполняется выбор для каждой из этих групп. Итак, каждая агрегация выполняется для конкретной группы, верно? @Тим Бигелайзен
Правильно... для каждой группы одинаковых записей месяца он выбирает максимальное значение в столбце типа данных. Когда условие истинно (для соответствующей строки), оно принимает максимальное значение данных, в противном случае оно принимает максимальное значение NULL, которое просто игнорируется при агрегировании.
Это то, чего ты хотел?
Попробуйте это,
Select * into #Temprecords from
(Select '2020-07-01' Record_date, 'max' Data_Type, 92 Data_Value Union
Select '2020-07-01' Record_date, 'min' Data_Type, 71 Data_Value Union
Select '2020-07-01' Record_date, 'avg' Data_Type, 74 Data_Value Union
Select '2020-07-02' Record_date, 'max' Data_Type, 90 Data_Value Union
Select '2020-07-02' Record_date, 'min' Data_Type, 67 Data_Value Union
Select '2020-07-02' Record_date, 'avg' Data_Type, 77 Data_Value ) A
;With Temprecords as
(Select Month(Record_date) Mth
,Case Data_Type When 'min' Then min(Data_Value) Else 0 END as MinTemp
,Case Data_Type When 'max' Then max(Data_Value) Else 0 End as MaxTemp
,Case Data_Type When 'avg' Then avg(Data_Value) Else 0 End as AvgTemp
from #TempRecords
Group By Month(Record_date), Data_Type
)
Select Mth as 'Month', SUM(MinTemp) 'Min', SUM(MaxTemp) 'Max', SUM(AvgTemp) 'AVG'
From Temprecords
Group By Mth
DROP table #TempRecords
Я отмечаю, что ссылка ведет на скрипт sql-сервера, но вопрос помечен как mysql, а код синтаксически неверен. dbfiddle.uk/mkSjiZ3f
:( пропустил это заметить.
Угадай, что? MySQL — это совершенно другой продукт, чем SQL Server. Сделайте себе одолжение и исправьте свои теги, чтобы нужные эксперты просмотрели ваше сообщение.