真以为自己懂 Group By 了?

能一眼看懂这条语句在做什么吗?

SELECT OrderMonth,City,Sum(OrderAmount) AS OrderAmount
FROM dbo.FctSalesMonthly
GROUP BY
Cube(OrderMonth,City)
ORDER BY OrderMonth DESC,City

前两天我是真的认认真真在看 MSDN 的文档,我发现我们的开发,写的明细列表和求和运算, 是动态 SQL 拼起来的:

1 先查询了明细列表,放在一段动态 SQL 里面
2 然后在这段动态 SQL 的外层,包了一层做了求和计算

这时,我们上次文章提到过的资深开发,过来了,看到我在看 Group By,觉得很奇怪:“ Group By 有什么好看的 ”。 我就把上面那条 SQL 给他看了,他看了连连摇头。我说,” 我觉得我们程序里的动态 SQL, 这么写不是很优雅,于是想借助官方文档,看看是不是另有技巧。果不其然, Group by 的写法还是可以很炫!”

记录如下:

/*—————————

Gruop By 子句:

1.Plain Group By
2.RollUp
3.Cube
4.Grouping Set

—————————-/

CREATE TABLE dbo.FctSalesMonthly (
ID BIGINT IDENTITY(1, 1) NOT NULL
,OrderMonth INT NULL
,City VARCHAR(20)
,OrderAmount INT
);

INSERT INTO dbo.FctSalesMonthly (
OrderMonth
,City
,OrderAmount
)
SELECT *
FROM (
VALUES (
201701
,’Shanghai’
,100
)
,(
201701
,’HangZhou’
,200
)
,(
201701
,’Suzhou’
,300
)
,(
201702
,’Shanghai’
,500
)
,(
201702
,’Chongqing’
,600
)
,(
201702
,’Suzhou’
,800
)
) tmp(OrderMonth, City, OrderAmount)

第一个怪写法:Cube

SELECT OrderMonth
,City
,Sum(OrderAmount) AS OrderAmount
FROM dbo.FctSalesMonthly
GROUP BY Cube(OrderMonth, City)
ORDER BY OrderMonth DESC
,City

第二个怪写法:RollUp

SELECT OrderMonth
,City
,Sum(OrderAmount) AS OrderAmount
FROM dbo.FctSalesMonthly
GROUP BY RollUp(OrderMonth, City)
ORDER BY OrderMonth DESC
,City

/*—————————-

Cube 与 RollUp 的区别:

  • 当只有一个维度作总计的时候,Cube 与 RollUp 实现的结果是一样的,都是分计加总计;

  • 当有2个或以上的维度作总计的时候,总计方法发生了变化:

    1. Rollup 的有向性 : 按照 literal 顺序, 从右到左的向上汇总,直到聚合了所有的维度数据;
    2. Cube 的自由组合性:将参与的每个维度,都按照 Rollup 的汇总方式,从左到右,从右到左,分别上卷汇总

—————————-/

第三个怪写法:Grouping Set

/*—————————-

Grouping Set

1.将参与的每个维度作分类统计,但不包含总计,使用()表达式将总计包含进来;
2.将Cube,RollUp 组合在一个表达式里面

—————————/

按照每个维度做分计,但是不计算总计:

SELECT OrderMonth,City,OrderDay,Sum(OrderAmount) AS OrderAmount
FROM dbo.FctSalesMonthly
GROUP BY
Grouping Sets (OrderMonth,City,OrderDay)
ORDER BY OrderMonth

按照每个维度做分计,并计算总计:

SELECT OrderMonth,City,Sum(OrderAmount) AS OrderAmount
FROM dbo.FctSalesMonthly
GROUP BY
Grouping Sets (OrderMonth,City,())
ORDER BY OrderMonth

怎么样,是不是很有意思呢?

谢谢阅读与分享,长按二维码关注 【有关SQL】

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dbLenis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值