SQL Server使用ROLLUP查询GROUPING

时间:2013-12-12 07:42:44

标签: sql-server grouping rollup

我正在尝试使用ROLLUP函数运行查询。

假设我的查询是:

SELECT  GEN.orgId,GEN.locId,GEN.rvcId
GEN.rvcName,GEN.menuItemID,GEN.menuItemName , SUM(salesTotal) as
salesTotal FROM GEN  GROUP BY  GEN.orgId,GEN.locId,
GEN.rvcName,GEN.menuItemID,GEN.menuItemName  ORDER BY GEN.menuItemName

此查询输出的内容为:

orgId  locId  rvcName          menuItemID    menuItemName        salesTotal
10200  10002  Sydney Retail    10870         Cho Milk Shake        7.500000
10200  10002  Sydney Wholesale 10870         Cho Milk Shake        7.500000
10200  10002  Sydney Retail    10850         Berry Milk Shake     10.920000
10200  10002  Sydney Wholesale 10850         Berry Milk Shake     10.920000
10200  10002  Sydney Retail    10898         Apple Custard         5.460000
10200  10002  Sydney Wholesale 10898         Apple Custard         5.460000

当我将GROUPING和ROLLUP应用于我的查询时:

SELECT GEN.orgId,GEN.locId,  GEN.menuItemID, GEN.menuItemName,
CASE WHEN GROUPING( GEN.rvcName) = 1
    THEN 'Grand Total'
    ELSE GEN.rvcName END as rvcName
,SUM(salesTotal) as salesTotal
GROUP BY GEN.orgId,GEN.locId, GEN.rvcId, GEN.rvcName, GEN.menuItemID, GEN.menuItemName WITH ROLLUP  
ORDER BY   GEN.menuItemID asc   

此查询输出(仅适用于Berry Milk Shake):

orgId   locId   menuItemID  menuItemName    rvcName           salesTotal
10200   10002   NULL            NULL             Sydney Retail     10.920000
10200   10002   NULL            NULL             Grand Total       10.920000
10200   10002   NULL            NULL             Sydney Wholesale  10.920000
10200   10002   NULL            NULL             Grand Total       10.920000
10200   10002   NULL            NULL             Grand Total       21.840000
10200   NULL    NULL            NULL             Grand Total       21.840000
NULL    NULL    NULL            NULL             Grand Total       21.840000
10200   10002   10850           Berry Milk Shake Sydney Wholesale  10.920000
10200   10002   10850           NULL             Sydney Wholesale  10.920000
10200   10002   10850           Berry Milk Shake Sydney Retail     10.920000
10200   10002   10850           NULL             Sydney Retail     10.920000

我的问题是:我使用此查询创建了许多不必要的数据。如何优化查询并生成如下所示的内容。提前谢谢。

我想要达到的目标是:

orgId  locId  rvcName           menuItemID    menuItemName          salesTotal
10200  10002  Sydney Retail     10870         Cho Milk Shake        7.500000
10200  10002  Sydney Wholesale  10870         Cho Milk Shake        7.500000
10200  10002  ALL               10870         Cho Milk Shake       15.000000
10200  10002  Sydney Retail     10850         Berry Milk Shake     10.920000
10200  10002  Sydney Wholesale  10850         Berry Milk Shake     10.920000
10200  10002  ALL               10850         Berry Milk Shake     21.840000
10200  10002  Sydney Retail     10898         Apple Custard         5.460000
10200  10002  Sydney Wholesale  10898         Apple Custard         5.460000
10200  10002  ALL               10898         Apple Custard        10.920000

1 个答案:

答案 0 :(得分:0)

再次感谢您提出这个问题.. 我想在此添加的一件事是,我们无法获得与您期望的相同的结果。 这背后的原因是,rvcName列数据不会以你想要的相同方式出现。 当我们按功能使用group时,我们在查询中包含的所有列数据都被组合在一起。

因此,所有悉尼零售,悉尼批发都将组合在一起。这肯定会得到你想要的结果。 如果您在预期答案中看到,则您对除rvcName之外的所有列的数据进行了分组。

所以,这是您的查询,我希望这可以指导您......

选择orgid,locid,rvcname,menuitemname,menuitemid,sum(salesTotal)作为'总销售额' 来自gen group by orgid,locid,rvcName,menuItemName,menuitemid with rollup

这会给你这样的结果

orgid locid rvcname menuitemname menuitemid总销售
1 2悉尼零售苹果蛋羹30 5.46
1 2悉尼零售苹果蛋羹NULL 5.46
1 2悉尼零售浆果摇20 10.92
1 2悉尼零售浆果摇动空10.92
1 2悉尼零售奶昔10 7.5 1 2悉尼零售奶昔NULL 7.5
1 2 sydney retail NULL NULL 23.88
1 2 syndney批发苹果蛋羹30 5.46
1 2 syndney批发苹果蛋羹NULL 5.46
1 2 syndney批发浆果摇20 10.92
1 2 syndney wholesale berry shake NULL 10.92
1 2 syndney批发奶昔10 7.5 1 2 syndney批发奶昔NULL 7.5
1 2 syndney wholesale NULL NULL 23.88
1 2 NULL NULL NULL 47.76
1 NULL NULL NULL NULL 47.76
NULL NULL NULL NULL NULL 47.76

希望你得到问题区域...唯一的事情是,当我们使用任何组函数/聚合函数时,所有类似的数据都被组合在一起。

如果结果文本看起来很乱,请尝试粘贴到excel中。我知道为什么虽然我将结果从sql server复制到excel,但它看起来很麻烦..如果不方便,请道歉。

如果您仍有疑问,请随时告诉我。

亲切的问候, Ashay(孟买/印度)