SQL для отображения всех нетранзакционных часов - PullRequest
0 голосов
/ 26 февраля 2019

Я показываю количество транзакций каждый час, и это прекрасно работает.Однако теперь у меня есть требование показать, что hr, на котором произошли 0 транзакций, существует вместе с hrs-транзакцией.так что отображайте номер часа и отображайте 0, если в этом часе нет счетчика транзакций.

Не уверен, смог ли я правильно объяснить, за что мне очень жаль (если я этого не делаю), но приведенный ниже оператор SQL ивыходные данные помогут вам понять, чего я пытаюсь достичь.

SQL-запрос, который я запускаю на SQL Server:

   SELECT CAST([transOcurredOn] AS DATE) as Dategg, 
   DATEPART(HH,transOcurredOn) as 'hour',
   COUNT(*) AS 'Trans count'
   FROM [tpTrans]
   WHERE [transOcurredOn] > '2016-06-18' 
   GROUP BY CAST([transOcurredOn] AS DATE) ,DATEPART(HH,transOcurredOn)
   ORDER BY Dategg,hour

Так что мой Текущий вывод выглядит как

enter image description here

мой новый вывод должен выглядеть ниже, чтобы охватить все часы с 7 до 23 часов.Я выделил изменение

enter image description here

Я немного изо всех сил, ценю, если кто-то указывает мне в правильном направлении

Цитата

ing, приложение

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Создайте табличную функцию и вызовите ее, чтобы создать таблицу дат и часов;

SELECT CONVERT(varchar(10),[Start_Date],101)'Date', DATEPART(HOUR,[Start_Date])'Hour' 
FROM generateDateTable('1/1/2019','1/12/2019','hour',1)
WHERE DATEPART(HOUR,[Start_Date]) >= 7

Определение функции;

CREATE function [dbo].[generateDateTable] 
(
@start_date datetime
, @end_date datetime
, @datepart varchar(20) = 'day'
, @step int = 1
)
returns @dates table 
(
start_date datetime, 
end_date datetime
)
as
begin
if( @datepart in ('year', 'yy', 'yyyy', 'quarter', 'qq', 'q', 'month', 'mm', 'm', 
'dayofyear', 'dy', 'y', 'day', 'dd', 'd', 'week', 'wk', 'ww') )
begin
    set @start_date = cast(floor(cast(@start_date as float)) as datetime)
    set @end_date = cast(floor(cast(@end_date as float)) as datetime)
end

declare @new_start datetime

while @start_date <= @end_date
begin
    set @new_start = (case 
        when @datepart in ('year', 'yy', 'yyyy') then dateadd(yy, @step, @start_date)
        when @datepart in ('quarter', 'qq', 'q') then dateadd(qq, @step, @start_date)
        when @datepart in ('month', 'mm', 'm') then dateadd(mm, @step, @start_date) 
        when @datepart in ('dayofyear', 'dy', 'y') then dateadd(dy, @step, 
 @start_date) 
        when @datepart in ('day', 'dd', 'd') then dateadd(dd, @step, @start_date) 
        when @datepart in ('week', 'wk', 'ww') then dateadd(ww, @step, @start_date) 
        when @datepart in ('hour', 'hh') then dateadd(hh, @step, @start_date) 
        when @datepart in ('minute', 'mi', 'n') then dateadd(n, @step, @start_date) 
        when @datepart in ('second', 'ss', 's') then dateadd(s, @step, @start_date) 
        when @datepart in ('millisecond', 'ms') then dateadd(ms, @step, @start_date) 
        else dateadd(dd, @step, @start_date)
    end)
        insert 
            @dates 
        (
          start_date
        , end_date
        ) values (
            @start_date
            , dateadd(ms, -3, @new_start)
        )
        set @start_date = @new_start
    end
    return 
end
0 голосов
/ 26 февраля 2019

Вы можете создать календарную таблицу для дат и счетную таблицу для часов.Используйте CROSS JOIN между этими таблицами, чтобы сгенерировать записи за 24 часа дня всех ваших возможных дат, а затем LEFT JOIN вашей таблицы.Окончательный запрос будет выглядеть примерно так:

   SELECT c.Date as Dategg, t.num as 'hour',
            COUNT(transOcurredOn) AS 'Trans count'
   FROM Calendar c
   CROSS JOIN Tally t
   LEFT JOIN [tpTrans] 
            ON t.num = DATEPART(HH,transOcurredOn)
            AND c.Date = CONVERT(DATE, [transOcurredOn] )
    WHERE c.Date> '2016-06-18' and c.Date <= GETDATE()
        AND t.num <=24
    GROUP BY c.Date ,t.num
    ORDER BY c.Date, t.num
...