【问题标题】:WITH ROLLUP is only producing NULLsWITH ROLLUP 只产生 NULL
【发布时间】:2017-04-16 11:15:27
【问题描述】:

这就是表格“正常”的样子

WorkloadCategory | WorkloadCapacity| WorkloadTotalTime
-----------------|-----------------|------------------
DI               | 317632          | 239.92
DI               | 106706          | 32.45
DI               | 35840           | 27.77
DI               | 50000           | 48.07
DI               | 8000            | 9.18
DI               | 29120           | 15.71
DI               | 0               | 0

使用以下查询:

SELECT
    wlc.WorkloadCategory,
    wl.WorkloadCapacity,
    ROUND(wl.WorkloadMinutes * wl.WorkloadCapacity / 60 / assum.WorkYearHours, 2) AS WorkloadTotalTime
FROM
    swam.Assumptions assum
CROSS JOIN 
    swam.WorkloadCategories wlc
INNER JOIN 
    swam.Workloads wl ON wlc.WorkloadCategoryID = wl.WorkloadCategoryID
ORDER BY
    wlc.WorkloadCategory

我想要做的只是简单地将 WorkloadCapacityWorkloadTotalTime 两列相加,并在表格底部有一个新行显示每列的总和。

我希望某些列为 NULL,因为这就是 ROLLUP 的工作方式,是的,我知道如果我愿意,我需要指定列名来读取“总计”……但我不明白为什么ROLLUP 的总和甚至根本没有显示出来。

我在本网站的另一篇文章中使用GROUP BY GROUPING SET(或类似的东西)尝试了类似的方法,但它并没有解决我遇到的问题。

SELECT
    wlc.WorkloadCategory,
    ROUND(wl.WorkloadMinutes * wl.WorkloadCapacity / 60 / assum.WorkYearHours, 2) AS WorkloadTotalTime
FROM
    swam.Assumptions assum
CROSS JOIN 
    swam.WorkloadCategories  wlc
INNER JOIN 
    swam.Workloads wl ON wlc.WorkloadCategoryID = wl.WorkloadCategoryID
GROUP BY
    wlc.WorkloadCategory, wl.WorkloadCapacity, 
    assum.WorkYearHours, wl.WorkloadMinutes WITH ROLLUP

输出表只是 FULL 的 NULLS!

WorkloadCategory | WorkloadCapacity | WorkloadTotalTime
DI               | 0                | 0
DI               | 0                | NULL
DI               | 0                | NULL
DI               | 8000             | 9.18
DI               | 8000             | NULL
DI               | 8000             | NULL
DI               | 29120            | 15.71
DI               | 29120            | NULL
DI               | 29120            | NULL
DI               | 35840            | 27.77
DI               | 35840            | NULL
DI               | 35840            | NULL
DI               | 50000            | 48.07
DI               | 50000            | NULL
DI               | 50000            | NULL
DI               | 106706           | 32.45
DI               | 106706           | NULL
DI               | 106706           | NULL
DI               | 317632           | 239.92
DI               | 317632           | NULL
DI               | 317632           | NULL
DI               | NULL             | NULL

提前感谢您提供的任何帮助。

【问题讨论】:

    标签: sql-server tsql rollup


    【解决方案1】:

    您的 WITH ROLLUP 不起作用,因为您已将每个数字字段上的查询作为类别告诉 GROUP,但您没有告诉它如何对总数求和。此外, WITH ROLLUP 将在 4 个字段中的每一个中汇总,但这不是您想要的。最后你只需要一个总数(可能是每个类别的总数),所以使用 GROUPING SETS 你可以告诉它你想要什么。

    类似这样的:

    SELECT
        wlc.WorkloadCategory,
        SUM(wl.WorkloadCapacity) AS WorkloadCapacity,
        SUM(ROUND(wl.WorkloadMinutes * wl.WorkloadCapacity / 60 / assum.WorkYearHours, 2)) AS WorkloadTotalTime
    FROM
        swam.Assumptions assum
    CROSS JOIN 
        swam.WorkloadCategories  wlc
    INNER JOIN 
        swam.Workloads wl ON wlc.WorkloadCategoryID = wl.WorkloadCategoryID
    GROUP BY GROUPING SETS (
      (wlc.WorkloadCategory, wl.WorkloadCapacity, assum.WorkYearHours, wl.WorkloadMinutes),
      (wlc.WorkloadCategory),
      ()
    )
    

    【讨论】:

    • 非常感谢您的帮助!
    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多