朋友问的一个关于group by的sql
提问:
一个表有三个字段id,dt,d 分别存放id,时间,数值
id dt d
1 2004-08-11 12:12:00.000 9
2 2005-09-11 12:08:00.000 2
3 2005-08-11 12:12:00.000 6
4 2005-09-11 12:12:00.000 10
5 2005-08-11 12:12:00.000 0
要求按照时间里的月份分组求d字段和
回答:
相应sql如下:
1
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[abc]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
2
drop table [dbo].[abc]
3
GO
4
5
CREATE TABLE [dbo].[abc] (
6
[id] [int] NOT NULL ,
7
[dt] [datetime] NULL ,
8
[d] [int] NULL
9
) ON [PRIMARY]
10
GO
11
12
13
insert into abc (id,dt,d) values(1,'2004-08-11 12:12:00',9)
14
insert into abc (id,dt,d) values(2,'2005-09-11 12:8:00',2)
15
insert into abc (id,dt,d) values(3,'2005-08-11 12:12:00',6)
16
insert into abc (id,dt,d) values(4,'2005-09-11 12:12:00',10)
17
insert into abc (id,dt,d) values(5,'2005-08-11 12:12:00',0)
18
insert into abc (id,dt,d) values(6,'2004-11-2 12:12:00',4)
19
insert into abc (id,dt,d) values(7,'2004-11-10 12:12:00',4)
20
insert into abc (id,dt,d) values(8,'2004-11-30 12:12:00',4)
21
22
select * from abc
23
select datepart(month,dt)as 月份,sum(d) as 合计 from abc group by datepart(month,dt)
24
25

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

其实就用了一个DATEPART函数
引申一下:如果统计1,2,3,4,5,6,7,8,9,10,11月上旬,11月中下旬,12月的怎么办?
可以这样:
1 select case datepart(month,dt)
2 when 11 then case sign(datepart(day,dt)-11) when -1 then 11 else 13 end
3 else datepart(month,dt) end as 月份,
4 sum(d) as 统计
5 from abc group by
6 case datepart(month,dt)
7 when 11 then case sign(datepart(day,dt)-11) when -1 then 11 else 13 end
8 else datepart(month,dt) end
2 when 11 then case sign(datepart(day,dt)-11) when -1 then 11 else 13 end
3 else datepart(month,dt) end as 月份,
4 sum(d) as 统计
5 from abc group by
6 case datepart(month,dt)
7 when 11 then case sign(datepart(day,dt)-11) when -1 then 11 else 13 end
8 else datepart(month,dt) end

------------------------------------------------------------------
再问再续:
1 按照旬统计
1
select
2
case (datepart(day,dt)-1)/10 when 0 then '上旬' when 1 then '中旬' else '下旬' end as 旬,
3
sum(d) as 统计
4
from abc group by
5
case (datepart(day,dt)-1)/10 when 0 then '上旬' when 1 then '中旬' else '下旬' end

2

3

4

5

2按 年+旬 分组统计
select
datename(year,dt)+datename(month,dt)+case (datepart(day,dt)-1)/10 when 0 then '上旬' when 1 then '中旬' else '下旬' end as 日期, sum(d) as 统计
from abc group by
datename(year,dt)+datename(month,dt)+case (datepart(day,dt)-1)/10 when 0 then '上旬' when 1 then '中旬' else '下旬' end
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗