SQLServer 行转列,统计,二次分组
来源:互联网 发布:windows复制粘贴失效 编辑:程序博客网 时间:2024/06/04 01:38
create table test
(
bizdate datetime, --日期
classes varchar(50), --班次 '白班' 或 '夜班'
qty int --产量
)
insert into test
select '2011-04-01','白班',154 union
select '2011-04-01','白班',400 union
select '2011-04-02','夜班',40 union
select '2011-04-02','白班',150 union
select '2011-04-03','夜班',130 union
select '2011-04-03','白班',400 union
select '2011-04-04','白班',520 union
select '2011-04-04','白班',1000 union
select '2011-04-04','白班',240
ps.日产量指每天的产量,包括白班和晚班
要统计成如下格式(日期唯一):
日期 白班总产量 夜班总产量 日产量
之前的写法是:
select bizdate,
Case when classes='白班' then Sum(qty) else 0 end AS '白班产量',
Case when classes='夜班' then SUM(qty) else 0 end AS '夜班产量'
from #test
group by bizdate,classes
此方式得到的结果中,每行只有一个班次有值,同一日期同一班次的产量没有合计起来
以下是正确结果,与上面不同的是,sum()函数用在了最外边,并且group by 里去掉了classes(此处影响很大)
select bizdate,
Sum(Case when classes='白班' then qty else 0 end) AS '白班产量',
Sum(Case when classes='夜班' then qty else 0 end) AS '夜班产量',
Sum(qty ) AS '日产量'
from test Group by bizdate
说明:
第一种写法之所以无法合计是因为在group by后多写了classes这列,sqlserver会依次按照bizDate、classes去分组,结果就导致班次有重复的。
第二种写法首先去掉多余的classes列(此列是需要被合并的,写在group by后纯属多余还大大影响查询结果),但是运行时会报错说classes未包含在聚合函数里,此时只需要把SUM()函数移到case when 外面,即可。这样就不必把classes写在group by里而去影响查询结果了。
- SQLServer 行转列,统计,二次分组
- SqlServer按半小时分组统计
- SqlServer单表分组多列统计实现
- Spark分组二次排序
- 分组统计
- 分组统计
- 分组统计
- 分组统计
- 分组统计
- 分组统计
- mysq 分组统计 avg分组统计
- SqlServer 分组显示序号
- SQLServer 时间分组
- sqlserver 分组合并
- 关于分组统计
- sql分组统计语句
- 按周分组统计
- 按里程碑分组统计
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
- SQLServer 添加序号列
- Mysql-----case when then else end
- android开发之线程的问题
- 时间复杂度和空间复杂度详解
- SQLServer 行转列,统计,二次分组
- 乐视&TCL战略成果发布会,这数据吓到友商了!
- SQLServer Union 和 Union All 在Insert 语句中的不同效果
- View在屏幕中的位置
- iPhone SE销量惨淡?看看这些数据就知道了
- SQLServer inner join,left join,right join,outer join 备忘备忘
- Ubuntu搭建subversion+usvn环境
- SQLServer 表连接时使用top 1 去除重复数据
- 如何更改linux文件的拥有者及用户组(chown和chgrp)