【问题标题】:SQL Pivot double sumSQL Pivot 双倍总和
【发布时间】:2019-06-05 13:19:35
【问题描述】:

我有如下查询结果:

dday         showtime             qty    total
2019-06-03   Sat 22/6 - 2:30 PM   1      50.00
2019-06-03   Sat 22/6 - 7:00 PM   1      50.00
2019-06-04   NULL                 NULL   NULL

我想以此为轴并显示一个新结果,将放映时间作为列,将“数量”和每个“dday”的总数相加,如下所示:

DAY     [Fri 21/6 - 7:00 PM]   [Sat 22/6 - 2:30 PM]   [Sat 22/6 - 7:00 PM]   TICKETS   AMOUNT
Jun 3   0                      1                      1                      2         100.00
Jun 4   0                      0                      0                      0         NULL

我正在使用这个查询:

SELECT
    CONVERT(CHAR(4), dday, 0) + CAST(DAY(dday) AS VARCHAR) 'DAY'
    , SUM(ISNULL([Thu 20/6  - 7:00 PM],0)) [Thu 20/6  - 7:00 PM],SUM(ISNULL([Fri 21/6  - 7:00 PM],0)) [Fri 21/6  - 7:00 PM],SUM(ISNULL([Sat 22/6  - 2:30 PM],0)) [Sat 22/6  - 2:30 PM],SUM(ISNULL([Sat 22/6  - 7:00 PM],0)) [Sat 22/6  - 7:00 PM]
    , SUM(ISNULL([Thu 20/6  - 7:00 PM],0)+ISNULL([Fri 21/6  - 7:00 PM],0)+ISNULL([Sat 22/6  - 2:30 PM],0)+ISNULL([Sat 22/6  - 7:00 PM],0)) 'TICKETS'
    , SUM(total) 'AMOUNT'
FROM   z
PIVOT
(
    MAX(qty)
    FOR showtime IN ([Thu 20/6  - 7:00 PM],[Fri 21/6  - 7:00 PM],[Sat 22/6  - 2:30 PM],[Sat 22/6  - 7:00 PM])
) AS P 
GROUP BY dday
ORDER BY dday   

但是我得到了这个结果:

DAY     [Fri 21/6 - 7:00 PM]   [Sat 22/6 - 2:30 PM]   [Sat 22/6 - 7:00 PM]   TICKETS   AMOUNT
Jun 3   0                      1                      1                      2         50.00
Jun 4   0                      0                      0                      0         NULL

数量“票”总和是正确的,但为什么金额总和显示为 50.00 而不是 100.00??

替代方案

我使用了另一种方法,应用 OUTER APPLY:

SELECT
     CONVERT(CHAR(4), dday, 0) + CAST(DAY(dday) AS VARCHAR) 'DAY'
    , SUM(ISNULL([Thu 20/6  - 7:00 PM],0)) [Thu 20/6  - 7:00 PM],SUM(ISNULL([Fri 21/6  - 7:00 PM],0)) [Fri 21/6  - 7:00 PM],SUM(ISNULL([Sat 22/6  - 2:30 PM],0)) [Sat 22/6  - 2:30 PM],SUM(ISNULL([Sat 22/6  - 7:00 PM],0)) [Sat 22/6  - 7:00 PM]
    , SUM(ISNULL([Thu 20/6  - 7:00 PM],0)+ISNULL([Fri 21/6  - 7:00 PM],0)+ISNULL([Sat 22/6  - 2:30 PM],0)+ISNULL([Sat 22/6  - 7:00 PM],0)) 'TICKETS'
    , SUPERTOTAL 'AMOUNT'
FROM   z AS j
OUTER APPLY
 ( 
    SELECT SUM(total) 'SUPERTOTAL'
    FROM z AS x
    WHERE x.dday = j.dday
 ) x
PIVOT
(
    MAX(qty)
    FOR showtime IN ([Thu 20/6  - 7:00 PM],[Fri 21/6  - 7:00 PM],[Sat 22/6  - 2:30 PM],[Sat 22/6  - 7:00 PM])
) AS P 
GROUP BY dday, SUPERTOTAL
ORDER BY dday

在这种情况下,它可以工作,但我真的需要为每个额外的总和应用这个“子查询”吗?是否有可能一次获得我想要的结果?

【问题讨论】:

  • 您有足够的声誉知道数据图像的接收率很低。请务必花时间提供格式为text 或DDL 和DML 语句的数据;而不是期望志愿者转录您的图像。

标签: sql-server-2012 sum pivot


【解决方案1】:

通过在查询中添加几个窗口函数的用法,您应该能够轻松获得整体 TotalTickets 总数。如果您在查询中使用sum(<col>) over(partition by <col>),您可以简化一些事情。

例如,如果您的表是:

CREATE TABLE yourtable
    ([dday] datetime, [showtime] varchar(18), [qty] int, [total] decimal(10,2))
;

INSERT INTO yourtable
    ([dday], [showtime], [qty], [total])
VALUES
    ('2019-06-03 00:00:00', 'Sat 22/6 - 2:30 PM', 8017, 50.00),
    ('2019-06-03 00:00:00', 'Sat 22/6 - 7:00 PM', 5019, 50.00),
    ('2019-06-04 00:00:00', NULL, NULL, NULL);

您可以将查询更改为:

select 
    CONVERT(CHAR(4), dday, 0) + CAST(DAY(dday) AS VARCHAR) 'DAY'
    ,ISNULL([Thu 20/6  - 7:00 PM],0) [Thu 20/6  - 7:00 PM]
    ,ISNULL([Fri 21/6  - 7:00 PM],0) [Fri 21/6  - 7:00 PM]
    ,ISNULL([Sat 22/6  - 2:30 PM],0) [Sat 22/6  - 2:30 PM]
    ,ISNULL([Sat 22/6  - 7:00 PM],0) [Sat 22/6  - 7:00 PM]
    , Isnull(Tickets, 0) Tickets
    , IsNull(Total, 0) Total
from
(
    SELECT 
        dday,
        showtime, 
        qty,
        Tickets= sum(qty) over(partition by dday),
        Total = sum(Total) over(partition by dday)
    FROM   yourtable
) d
PIVOT
(
    MAX(qty)
    FOR showtime IN ([Thu 20/6  - 7:00 PM],[Fri 21/6  - 7:00 PM],[Sat 22/6  - 2:30 PM],[Sat 22/6  - 7:00 PM])
) AS P 

不同的是我使用的子查询里面:

Tickets= sum(qty) over(partition by dday),
Total = sum(Total) over(partition by dday)

这是为每个 dday 创建票证的总和,如果您在 PIVOT 之前使用此数据,则在应用 @ 的 GROUP BY 方面之前,您将拥有相同的值987654330@ 功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2013-08-07
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多