WITH ROLLUP is only producing NULLs

元气小坏坏 提交于 2019-12-12 23:08:59

问题


This is what the table looks like "normally"

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

Using the following query:

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

What I want to do is simply sum the two columns WorkloadCapacity and WorkloadTotalTime and have a new row at the bottom of the table that displays those sum for each column.

I expected some column to be NULL because that's how ROLLUP works and yes, I understand I would need to specify the column name to read 'Total" if I wanted.... But what I don't understand is why the sums from ROLLUP are not even showing up at all.

I tried something similar using GROUP BY GROUPING SET (or something like that) from another post on this site, but it did not solve the issue I'm having.

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

The output table is just FULL of 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

Thanks in advance for any help you can provide.


回答1:


Your WITH ROLLUP isn't working because you've told the query to GROUP on each of the number fields as categories but you've not told it how to SUM the total. Further, WITH ROLLUP will roll up in each of the 4 fields but that's not what you want. You are after only a total at the end (and maybe a total per category) so with GROUPING SETS you can tell it what you want.

Something like this:

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),
  ()
)


来源:https://stackoverflow.com/questions/40917043/with-rollup-is-only-producing-nulls

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!