T-SQL - 习题02_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式
- 时间:2017-09-11 整理:byzqy
题目:有个年度统计表,结构如下:
怎么样把这个表,查询成这样一个结果:
这是在面试过程中遇到的一个关于数据库的题,没有一点思路,不知它考查到的知识点是什么,如何下手?
网上搜了一下,有哥们儿说这是典型的“行转列问题”,好像用到“交叉表查询”,下面看看具体的代码!
文件:SQLQuery1.sql
/* 环境:Microsoft SQL Server 2012 工具: Microsoft SQL Server Management Studio 数据库: Interview 数据表: statistic 详情: year month amount 1991 1 1.1 1991 2 1.2 1991 3 1.3 1991 4 1.4 1992 1 2.1 1992 2 2.2 1992 3 2.3 1992 4 2.4 (char(10)) (int) (float) 查询成如下结果: year m1 m2 m3 m4 1991 1.1 1.2 1.3 1.4 1992 2.1 2.2 2.3 2.4 */--方法1 SELECTyear,SUM ( CASE WHEN month = 1 THEN amount ELSE 0 END ) AS m1,SUM ( CASE WHEN month = 2 THEN amount ELSE 0 END ) AS m2,SUM ( CASE WHEN month = 3 THEN amount ELSE 0 END ) AS m3,SUM ( CASE WHEN month = 4 THEN amount ELSE 0 END ) AS m4 FROMstatistic GROUP BYyear-->查询结果:year m1 m2 m3 m41991 1.1 1.2 1.3 1.41992 2.1 2.2 2.3 2.4--方法2 SELECT year,MAX(CASE month WHEN 1 THEN amount ELSE 0 END) m1,MAX(CASE month WHEN 2 THEN amount ELSE 0 END) m2, MAX(CASE month WHEN 3 THEN amount ELSE 0 END) m3,MAX(CASE month WHEN 4 THEN amount ELSE 0 END) m4 FROM statistic GROUP BY year-->查询结果:year m1 m2 m3 m41991 1.1 1.2 1.3 1.41992 2.1 2.2 2.3 2.4--方法3 SELECT year, (SELECT amount FROM statistic m WHERE month=1 AND m.year=statistic.year) AS m1, (SELECT amount FROM statistic m WHERE month=2 AND m.year=statistic.year) AS m2, (SELECT amount FROM statistic m WHERE month=3 AND m.year=statistic.year) AS m3, (SELECT amount FROM statistic m WHERE month=4 AND m.year=statistic.year) AS m4 FROM statistic GROUP BY year-->查询结果:year m1 m2 m3 m41991 1.1 1.2 1.3 1.41992 2.1 2.2 2.3 2.4
运行结果:
代码分解:
--方法1变形:将代码中的0改为1,计算SUM,看看会发生什么 SELECTyear,SUM ( CASE WHEN month = 1 THEN amount ELSE 1 END ) AS m1,SUM ( CASE WHEN month = 2 THEN amount ELSE 1 END ) AS m2,SUM ( CASE WHEN month = 3 THEN amount ELSE 1 END ) AS m3,SUM ( CASE WHEN month = 4 THEN amount ELSE 1 END ) AS m4 FROMstatistic GROUP BYyear-->查询结果:year m1 m2 m3 m41991 4.1 4.2 4.3 4.41992 5.1 5.2 5.3 5.4--方法2变形1:将MAX关键字换为MIN SELECT year,MIN(CASE month WHEN 1 THEN amount ELSE 0 END) m1,MIN(CASE month WHEN 2 THEN amount ELSE 0 END) m2, MIN(CASE month WHEN 3 THEN amount ELSE 0 END) m3,MIN(CASE month WHEN 4 THEN amount ELSE 0 END) m4 FROM statistic GROUP BY year-->查询结果:year m1 m2 m3 m41991 0 0 0 01992 0 0 0 0--方法2变形2:将MAX关键字换为MIN,并将0换为1 SELECT year,MIN(CASE month WHEN 1 THEN amount ELSE 1 END) m1,MIN(CASE month WHEN 2 THEN amount ELSE 1 END) m2, MIN(CASE month WHEN 3 THEN amount ELSE 1 END) m3,MIN(CASE month WHEN 4 THEN amount ELSE 1 END) m4 FROM statistic GROUP BY year-->查询结果:year m1 m2 m3 m41991 1 1 1 11992 1 1 1 1--方法2变形3:将MAX关键字换为SUM,并将0换为1 SELECT year,SUM(CASE month WHEN 1 THEN amount ELSE 1 END) m1,SUM(CASE month WHEN 2 THEN amount ELSE 1 END) m2, SUM(CASE month WHEN 3 THEN amount ELSE 1 END) m3,SUM(CASE month WHEN 4 THEN amount ELSE 1 END) m4 FROM statistic GROUP BY year-->查询结果:year m1 m2 m3 m41991 4.1 4.2 4.3 4.41992 5.1 5.2 5.3 5.4
以上整理,如有错误之处或有更好的方法,请看到朋友不吝指正,谢谢!
参考文章:
https://zhidao.baidu.com/question/550776347.html
https://zhidao.baidu.com/question/486996750.html
https://www.zybang.com/question/0ac74f3ae058071e80274e23d5e1042a.html
转载于:https://www.cnblogs.com/jswl/p/7504795.html
T-SQL - 习题02_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式相关推荐
- sql server 导入excel数据表
sql server 导入excel数据表 之前谈到过在sql server中对用户的购买记录做过关联分析,数据来源是来自sql server数据库,但有的时候,数据源来自于其他文件,比如excel文 ...
- 【MySQL】根据数据表中日期字段查询某个月每一天的数据量?查询数据表中所有日期每天的数据量?近三天每天数据量?
前提这个table有一个日期字段date_time之类的 1.根据数据表中日期字段查询某个月每一天的数据量 如果要获取8月的数据,可以这么写: SELECT count(*), DATE_FORMAT ...
- 如何将Sql Server中的数据表导入到PowerDesigner中
本文主要介绍一下基本工作 如何将在SQL Server中设计好的数据表结构导入到PowerDesigner中. 我采用的是SQL Server 2005跟PowerDesigner15.1版本,首先打 ...
- Sql中如何将数据表的两个字段的值如何互换?
今天遇到一个数据表的两个列数据要互换,在网上找到并记录下. 直接用Sql就可以搞定,语法如下 --将数据表中两个列数据互换的语法-- update tabName set field1=field2, ...
- SQL数据库语言基础之SqlServer条件查询、排序数据表、like模糊查询【大总结】
文章目录 一.语句查询数据(SELECT) 二.获取满足查询条件的语句(WHERE) 三.排序查询(ORDER BY) 四.高级条件查询 一.语句查询数据(SELECT) 1.在SSMS中查看数据 在 ...
- SQL Server 数据库中将数据表中的数据转化为Insert 语句
Use Northwind Select 'Insert Into Customer(CustomerID,CompanyName,ContactName) Values ('+'''' +Cust ...
- SQL代码——数据库,数据表代码操作
数据库 创建数据库Create database db_library; 查看数据库show databases; 选择数据库ues db_library; 删除数据库drop database db ...
- SqlServer中通过Sql语句批量删除数据表
业务描述: 我们在实际生产中,有时候可能会需要批量删除数据库中的某些数据表(比如:在导数据时,需要将数据库A中的某些表数据导入到数据库B中,导入的过程中也需要将数据库A的某些表结构也需要导过去,当数据 ...
- SQL sever创建数据库数据表
创建数据库和数据表 一.目的: 掌握在SQL Server中使用对象资源管理器和SQL命令创建数据库与修改数据库的方法. 掌握在SQL Server中使用对象资源管理器或者SQL命令创建数据表和修改数 ...
最新文章
- Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)
- PHP date 格式化一个本地时间/日期
- python自带 python2转python3 代码工具
- MySQL 错误对照表
- HIbernate实现增、删、改、查。
- 解决ubuntu16.E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
- android dpi
- 警笛声c语言程序,PIC警笛声音的程序
- NUCLEUS:13:西门子实时操作系统 Nucleus漏洞影响物联网设备等
- h5点击按钮之后按钮消失_小程序webview跳转页面后没有返回按钮完美解决方案
- 广告化开发(基础知识)~广告效果指标CTR/CVR/ROI/ARPU的理解
- 人机交互-8-交互式系统设计
- Atcoder Beginner Contest (ABC) 237 A - E
- Gstore官网学习三:快速入门
- NR协议学习——RLC
- 过期策略(TTL)与淘汰策略
- linux下使用tar命令解压.tar.gz文件是参数的说明
- js SM3 和 java SM3
- Windows版Sketch软件也太好用了吧!
- defaultbutton IE11下不起作用