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 行转列,统计,二次分组的更多相关文章

  1. Mysql 列转行统计查询 、行转列统计查询

      -- ---------------------------- -- Table structure for `TabName` -- ---------------------------- D ...

  2. C语言:将3*5矩阵中第k列的元素左移到第0列,第k列以后的每列元素依次左移,原来左边的各列依次绕到右边。-在m行m列的二维数组中存放如下规律的数据,

    //将3*5矩阵中第k列的元素左移到第0列,第k列以后的每列元素依次左移,原来左边的各列依次绕到右边. #include <stdio.h> #define M 3 #define N 5 ...

  3. 数据库-SqlServer 行转列,列转行

    两篇行转列,列转行的实例文章: 第1篇:https://www.cnblogs.com/cpcpc/archive/2013/04/08/3009021.html 第2篇:https://mp.wei ...

  4. SQLserver行转列与列转行

    行表: 行表 姓名 属性 属性值 JACK 身高 180 JACK 体重 80 JACK 年龄 27 TOM 身高 164 TOM 体重 59 TOM 年龄 20 列表: 列表 姓名 身高 年龄 体重 ...

  5. SqlServer 行转列,列转行 以及PIVOT函数快速实现行转列,UNPIVOT实现列转行

     一   .列转行 创建所需的数据 CREATE TABLE [StudentScores]( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(3 ...

  6. SqlServer行转列(PIVOT),列转行(UNPIVOT)总结

    PIVOT用于将列值旋转为列名(即行转列) 语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list ...

  7. SQlserver 行转列

    列转行编程中很容易碰到,小弟在此总结下, 行转列暂时还没遇到,遇到再补充. 列转行:  , , , ,  以上都是以逗号分隔,分隔符可以自定义.

  8. sqlserver 行转列 语文,数学,物理,化学

    数据库查询行转列 1.原数据库值 stdname stdsubject result 张三 语文 张三 数学 张三 物理 李四 语文 李四 数学 李四 物理 李四 化学 李四 化学 2.要得到如下表 ...

  9. sqlserver 行转列、列转行[转]

    转自:http://www.cnblogs.com/luofuxian/archive/2012/02/23/2364328.html Sql Server 行转列.列转行   创建表:   CREA ...

  10. sqlserver 行转列、字符串行转列、自动生产行转列脚本

    行转列,老生常谈的问题.这里总结一下网上的方法. 1.生成测试数据: CREATE TABLE human( name ), --姓名 norm ), --指标 score INT , --分数 gr ...

随机推荐

  1. 测试 Zoundry Raven

    安装很方便,看看发布的内容是否好用 但发现从博客上取下来的内容是有问题的,不能正常打开

  2. 【sqli-labs】 less40 GET -Blind based -String -Stacked(GET型基于盲注的堆叠查询字符型注入)

    提交,页面正常,说明是')闭合的 http://192.168.136.128/sqli-labs-master/Less-40/?id=1')%23 http://192.168.136.128/s ...

  3. 通过yum仓库安装mysql

    1,下载安装包wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm2,安装mysql源yum -y ins ...

  4. 1016 部分A+B (15 分)

    正整数 AAA 的“DAD_AD​A​​(为 1 位整数)部分”定义为由 AAA 中所有 DAD_AD​A​​ 组成的新整数 PAP_AP​A​​.例如:给定 A=3862767A = 3862767 ...

  5. [POJ2404]Jogging Trails

    我太弱了. 我们可以知道一个结论就是对于一个图的话假如所有点的度数都是偶数,那么只需要走一波欧拉回路. 所以我们就把奇点补成偶点. 将两个奇点补充到偶点的最佳方法是选择任意两个奇点连最短路径为权的边 ...

  6. Linux系统下打印第n行的方法

    方法一:cat cat filename | head -n 5 | tail -n +5 方法二:sed sed -n '5p' filename 扩展:打印第3~5行 cat filename | ...

  7. [bzoj3505][CQOI2014]数三角形_组合数学

    数三角形 bzoj-3505 CQOI-2014 题目大意:给你一个n*m的网格图,问你从中选取三个点,能构成三角形的个数. 注释:$1\le n,m\le 1000$. 想法:本来是想着等中考完了之 ...

  8. 网络编程中的CAP & 有趣的存储框架(关系型、NoSQL)全图

    第七篇 CAP https://zhuanlan.zhihu.com/p/20399316?refer=auxten   CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s t ...

  9. Oracle中如何判断字符串是否全为数字

    Oracle中如何判断字符串是否全为数字 学习了:http://www.cnblogs.com/zrcoffee/archive/2012/12/11/2812744.html 本文介绍了判断字符串是 ...

  10. hdu 4865 Peter&#39;s Hobby(2014 多校联合第一场 E)

    Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...