I need to write such query:
x
SELECT CAST (date_time_column AS DATE) as 'Date',
AVG(CASE WHEN FORMAT(date_time_column, 'HH:mm') = '00:00' then my_values ELSE NULL end) as '00:00',
..
AVG(CASE WHEN FORMAT(date_time_column, 'HH:mm') = '23:59' then my_values ELSE NULL end) as '23:59'
FROM table
where date_time_column > '2021-08-12'
GROUP BY CAST (date_time_column AS DATE)
What is a way to avoid writing 1440 lines in a query?
Advertisement
Answer
Try the below method (Change the variables to match your table and field)
/*Generate all minutes in a day in a string variable*/
Declare @timeRange varchar(max)=null
declare @startdate Datetime='2021-08-12 00:00';
; WITH cte AS
(
SELECT 1 i, @startdate AS resultDate
UNION ALL
SELECT i + 1, DATEADD(minute, i, @startdate )
FROM cte
WHERE DATEADD(minute, i, @startdate ) < DateAdd(day,1,@startdate)
)
SELECT @timeRange=Coalesce(@timeRange +',' + '['+Format(resultDate,'HH:mm')+']','['+Format(resultDate,'HH:mm')+']') FROM cte
OPTION (MAXRECURSION 2000);
/* (Change These variables to match your table & fields */
declare @filterQuery varchar(300)=' where {date_time_column}>''2021-01-01''';
declare @dateTimeColumn varchar(30)='{date_time_column}';
declare @valueColumn varchar(30)='{value_column}';
declare @myTable varchar(20)='{my_table}';
/*Generate Pivot Query */
DECLARE @query AS NVARCHAR(MAX);
set @query= '
SELECT *
FROM (SELECT Cast('+ @dateTimeColumn +' as Date) Resultdate,
FORMAT(' + @dateTimeColumn + ', ''HH:mm'') DateMinute,
' + @valueColumn + ' FROM ' + @myTable + ' ' + @filterQuery +'
) FormattedData
PIVOT( AVG('+ @valueColumn + ')
FOR DateMinute IN ('+ @timeRange +')
) AS pivotTable
';
/*Execute Generated Query*/
execute(@query)