Сводная таблица, добавляющая пустые строки

#sql #pivot

Вопрос:

Я пытаюсь найти средние продажи, количество продаж и сумму продаж за каждый рабочий час в течение месяца. DepartmentID = 1 означает Обед и 3 означает доставку. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что сводный результат добавляет нулевые строки, которые преобразуются в ноль из-за ISNULL. Я хочу преобразовать результат в двух строках в одну строку. Эта проблема возникает, когда я добавляю более одной агрегатной функции.

Любая помощь будет признательна.

введите описание изображения здесь

Мой код таков:

 USE [sambapos]
GO
;with sales as (
SELECT
    DATEPART(YEAR, t.[Date]) as 'Year',
    DATEPART(MONTH, t.[Date]) as 'Month',
    DATEPART(HOUR, t.[Date]) as 'Hour',
    CASE
        WHEN t.DepartmentId = 1 THEN 'DineInSale'
        WHEN t.DepartmentId = 3 THEN 'DeliverySale'
    END AS 'DepartmentSale',
    CASE
        WHEN t.DepartmentId = 1 THEN 'DineInCount'
        WHEN t.DepartmentId = 3 THEN 'DeliveryCount'
    END AS 'DepartmentCount',
    CASE
        WHEN t.DepartmentId = 1 THEN 'DineInSum'
        WHEN t.DepartmentId = 3 THEN 'DeliverySum'
    END AS 'DepartmentSum',
    AVG(t.[TotalAmount]) as 'Avg Sale',
    SUM(t.[TotalAmount]) as 'Sum Sale',
    COUNT(t.[TotalAmount]) as 'Count'
FROM
    dbo.Tickets t
GROUP BY
    t.[DepartmentId],
    DATEPART(YEAR, t.[Date]),
    DATEPART(MONTH, t.[Date]),
    DATEPART(HOUR, t.[Date])
)   
SELECT 
    [Year], 
    [Month], 
    [Hour], 
    ISNULL([DineInSale], 0) as 'DineInSale', 
    ISNULL([DeliverySale], 0) as 'DeliverySale',
    ISNULL([DineInCount], 0) as 'DineInCount', 
    ISNULL([DeliveryCount], 0) as 'DeliveryCount',
    ISNULL([DineInSum], 0) as 'DineInSum', 
    ISNULL([DeliverySum], 0) as 'DeliverySum'
FROM
    sales
    PIVOT (
        SUM([Avg Sale])
        FOR [DepartmentSale] IN (
            [DineInSale], [DeliverySale]
        )
    ) as avg_pivot

    PIVOT (
        SUM([Count])
        FOR [DepartmentCount] IN (
            [DineInCount], [DeliveryCount]
        ) 
    ) as count_pivot

    PIVOT (
        SUM([Sum Sale])
        FOR [DepartmentSum] IN (
            [DineInSum], [DeliverySum]
        )
    ) as sum_pivot


WHERE
    [Year] = 2021
    AND 
    ([Hour] <= 3 OR [Hour] >= 21)
ORDER BY
    [Month] DESC, 
    CASE 
    WHEN [Hour] = 21 THEN -3
    WHEN [Hour] = 22 THEN -2
    WHEN [Hour] = 23 THEN -1
    ELSE [Hour] 
END ASC
GO