`
ronon
  • 浏览: 192346 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

SQLServer 行转列,统计,二次分组

 
阅读更多

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里而去影响查询结果了。

分享到:
评论

相关推荐

    SQL server 2000自学教程

    SQL Server 2000是微软公司推出的一款关系型数据库管理系统,它在IT领域中扮演着数据存储和管理的重要角色。本自学教程旨在帮助初学者掌握SQL Server 2000的基本概念、安装配置、数据库管理、数据查询、数据操作以及...

    sql server如何利用开窗函数over()进行分组统计

    总的来说,开窗函数在SQL Server中提供了更灵活的数据分析能力,能够帮助我们更有效地处理复杂的数据统计任务,而无需频繁地使用子查询或JOIN操作。理解和熟练掌握开窗函数是提高SQL查询性能的关键步骤。

    SQL-Server-期末考试题目及答案.doc

    2. Transact-SQL 提供了分组(Group By)查询功能和 Min、Max 等统计函数。 3. 语句“USE master GO SELECT * FROM sysfiles GO”包括 2 个批处理。 六、其他 1. SQL Server 2000 标准版不支持 Windows 98 操作...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    5.2.1 二次缩放(Quadratic Scaling)的一个例子 5.2.2 具有线性复杂度的算法 5.2.3 指数和超指数复杂度 5.2.4 次线性(sublinear)复杂度 5.2.5 常量复杂度 5.2.6 复杂度的技术定义 5.2.7 复杂度的比较 5.3 ...

    SQL Server 2008开发新特性系列课程(9):SQL Server 2008的T-SQL新特性

    这些函数可以提供行级别的上下文信息,用于计算排名、分组累计和移动平均等统计分析任务,无需进行复杂的自连接或子查询。 四、FILESTREAM支持 FILESTREAM特性允许BLOB数据(如图像、文档等)存储在文件系统中,而...

    SQL Server 2005入门

    标题《SQL Server 2005入门》和描述中提到的是关于SQL Server 2005的入门级教程,重点在于SQL语句的用法和数据库函数的使用,特别适合初学者。下面将详细展开这些知识点。 首先,SQL Server 2005是微软推出的一款...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    5.2.1 二次缩放(Quadratic Scaling)的一个例子217 5.2.2 具有线性复杂度的算法218 5.2.3 指数和超指数复杂度218 5.2.4 次线性(sublinear)复杂度219 5.2.5 常量复杂度219 5.2.6 复杂度的技术定义220 5.2.7 复杂度...

    sql数据分组

    ### SQL 数据分组详解 #### 一、问题背景与需求分析 在数据库处理过程中,我们经常需要对数据进行分组处理。例如,在本案例中,我们需要处理的数据表包含两列:`c1` 和 `c2`。每一对 `(c1, c2)` 表示一种特殊的...

    sqlserver命令合集.doc

    8. FIRST(column): 在SQL Server 2000中不受支持,但在更现代的版本中,你可以使用 `TOP 1` 或 `RANK()` 函数来获取指定列的第一个记录。 9. LAST(column): 同样在SQL Server 2000中不受支持,可以使用 `TOP (1) ...

    MYSQL,SQLSERVER,ORACLE常用的函数

    根据提供的标题和描述,本文将详细介绍在MySQL、SQL Server以及Oracle数据库中常用的函数。这些函数主要分为几大类:字符串处理函数、数值处理函数、日期处理函数、转换函数以及其他一些特殊用途的函数。 ### 字符...

    SQL server 2000入门上机指导

    《SQL Server 2000入门上机指导》是一本非常适合初学者的SQL教程,它主要涵盖了SQL Server 2000的基本操作和核心概念,旨在帮助读者快速掌握数据库管理和查询技能。以下是对各实验内容的详细说明: 实验一:SQL ...

    T-SQL编程入门(SQL Server)

    ### T-SQL编程入门(SQL Server) #### 一、T-SQL的组成 T-SQL (Transact-SQL) 是 Microsoft SQL Server 使用的一种扩展版本的 SQL 语言,它提供了额外的功能来增强 SQL 的功能,使开发者能够更高效地管理和操作...

    Sql Server:多行合并成一行,并做分组统计的两个方法

    在Sql Server中进行多行合并成一行,并做分组统计的需求,可以通过两种主要方法实现。首先,需要创建一个测试表并插入数据,以供后续操作。以下是创建测试表和插入数据的SQL语句: ```sql CREATE TABLE test(code ...

    【如果积分自动变为不为0请留言联系我修改】sql数据库训练SQL server PPt详解

    2. **查询语句**:SQL Server支持复杂的查询操作,如JOIN用于连接多个表,GROUP BY用于对数据进行分组,HAVING用于在聚合函数后添加条件,ORDER BY用于排序结果,以及子查询用于嵌套查询。 3. **范式理论**:范式是...

    解剖SQL执行计划

    ### 解剖SQL Server执行计划 #### 一、执行计划概览 在深入探讨SQL Server执行计划之前,我们首先需要理解什么是执行计划以及它为何如此重要。执行计划是SQL Server优化器为查询选择的最佳运行策略。当数据库...

    SQL Server数据库设计和高级查询内测

    在IT领域,SQL Server是一款广泛使用的商业关系型数据库管理系统,由微软公司开发并维护。它在数据存储、处理和管理方面扮演着至关重要的角色。在这个“SQL Server数据库设计和高级查询内测”主题中,我们将深入探讨...

Global site tag (gtag.js) - Google Analytics