真以为自己懂 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】

这里写图片描述

在 MyBatis-Plus 中,可以使用 `@Select` 注解结合原生 SQL 或者使用 `QueryWrapper` 构建器来实现 GROUP BY 查询。 下面分别介绍这两种方式的使用方法: ### 使用 @Select 注解与原生 SQL 1. 在 Mapper 接口中定义查询方法,并使用 `@Select` 注解指定原生 SQL 查询语句。例如: ```java import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Map; @Mapper public interface MyMapper { @Select("SELECT column1, COUNT(column2) as count FROM table_name GROUP BY column1") List<Map<String, Object>> groupByQuery(); } ``` 上述示例中,`groupByQuery()` 方法使用 `@Select` 注解指定了原生的 SQL 查询语句,其中 `column1` 是需要分组的列,`column2` 是需要进行聚合计数的列。 2. 在代码中调用该方法进行查询,获取结果。 ```java @Autowired private MyMapper myMapper; public List<Map<String, Object>> performGroupByQuery() { return myMapper.groupByQuery(); } ``` 通过调用 `groupByQuery()` 方法,即可执行 GROUP BY 查询并获取结果。 ### 使用 QueryWrapper 构建器 1. 在代码中创建一个 `QueryWrapper` 对象,并使用 `groupBy()` 方法指定需要分组的列。例如: ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service public class MyService { @Autowired private MyMapper myMapper; public List<Map<String, Object>> performGroupByQuery() { QueryWrapper<MyEntity> queryWrapper = new QueryWrapper<>(); queryWrapper.groupBy("column1"); return myMapper.selectMaps(queryWrapper); } } ``` 上述示例中,`performGroupByQuery()` 方法创建了一个 `QueryWrapper` 对象,并使用 `groupBy()` 方法指定了需要分组的列名。 2. 调用 `selectMaps()` 方法执行查询,并传入 `QueryWrapper` 对象。这样就可以执行 GROUP BY 查询,并获取结果。 注意:使用 QueryWrapper 构建器时,需要确保相关的实体类(例如 `MyEntity`)与数据库表对应,并且指定了映射关系,否则无法正常执行查询。 以上是 MyBatis-Plus 中使用 GROUP BY 的两种方式,你可以根据自己的需求选择其中一种方式来实现。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

dbLenis

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

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

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

打赏作者

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

抵扣说明:

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

余额充值