1

我正在尝试使用 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
4

1 回答 1

0

再次感谢这个问题。我想在这里补充的一件事是,我们无法得到与您在这里期望的相同的结果。其背后的原因是, rvcName 列数据不会以您想要的方式出现。当我们使用 group by 函数时,我们在查询中包含的所有列数据都被分组在一起。

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

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

选择 orgid,locid,rvcname, menuitemname,menuitemid, sum(salesTotal) as 'total sale' from 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 悉尼零售浆果奶昔 NULL 10.92
1 2 悉尼零售奶昔 10 7.5
1 2 悉尼零售奶昔 NULL 7.5
1 2 悉尼零售 NULL NULL 23.88
1 2 悉尼批发苹果奶油冻 30 5.46
1 2 悉尼批发苹果奶油冻 NULL 5.46
1 2 悉尼批发浆果奶昔 20 10.92
1 2 悉尼批发浆果奶昔 NULL 10.92
1 2 syndney 批发奶昔 10 7.5
1 2 syndney 批发奶昔 NULL 7.5
1 2 syndney 批发 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(孟买/印度)

于 2013-12-13T05:16:05.210 回答