• 时间: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的样式相关推荐

  1. sql server 导入excel数据表

    sql server 导入excel数据表 之前谈到过在sql server中对用户的购买记录做过关联分析,数据来源是来自sql server数据库,但有的时候,数据源来自于其他文件,比如excel文 ...

  2. 【MySQL】根据数据表中日期字段查询某个月每一天的数据量?查询数据表中所有日期每天的数据量?近三天每天数据量?

    前提这个table有一个日期字段date_time之类的 1.根据数据表中日期字段查询某个月每一天的数据量 如果要获取8月的数据,可以这么写: SELECT count(*), DATE_FORMAT ...

  3. 如何将Sql Server中的数据表导入到PowerDesigner中

    本文主要介绍一下基本工作 如何将在SQL Server中设计好的数据表结构导入到PowerDesigner中. 我采用的是SQL Server 2005跟PowerDesigner15.1版本,首先打 ...

  4. Sql中如何将数据表的两个字段的值如何互换?

    今天遇到一个数据表的两个列数据要互换,在网上找到并记录下. 直接用Sql就可以搞定,语法如下 --将数据表中两个列数据互换的语法-- update tabName set field1=field2, ...

  5. SQL数据库语言基础之SqlServer条件查询、排序数据表、like模糊查询【大总结】

    文章目录 一.语句查询数据(SELECT) 二.获取满足查询条件的语句(WHERE) 三.排序查询(ORDER BY) 四.高级条件查询 一.语句查询数据(SELECT) 1.在SSMS中查看数据 在 ...

  6. SQL Server 数据库中将数据表中的数据转化为Insert 语句

    Use Northwind Select 'Insert Into Customer(CustomerID,CompanyName,ContactName)  Values ('+'''' +Cust ...

  7. SQL代码——数据库,数据表代码操作

    数据库 创建数据库Create database db_library; 查看数据库show databases; 选择数据库ues db_library; 删除数据库drop database db ...

  8. SqlServer中通过Sql语句批量删除数据表

    业务描述: 我们在实际生产中,有时候可能会需要批量删除数据库中的某些数据表(比如:在导数据时,需要将数据库A中的某些表数据导入到数据库B中,导入的过程中也需要将数据库A的某些表结构也需要导过去,当数据 ...

  9. SQL sever创建数据库数据表

    创建数据库和数据表 一.目的: 掌握在SQL Server中使用对象资源管理器和SQL命令创建数据库与修改数据库的方法. 掌握在SQL Server中使用对象资源管理器或者SQL命令创建数据表和修改数 ...

最新文章

  1. Spring Cloud(十一)高可用的分布式配置中心 Spring Cloud Bus 消息总线集成(RabbitMQ)
  2. PHP date 格式化一个本地时间/日期
  3. python自带 python2转python3 代码工具
  4. MySQL 错误对照表
  5. HIbernate实现增、删、改、查。
  6. 解决ubuntu16.E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
  7. android dpi
  8. 警笛声c语言程序,PIC警笛声音的程序
  9. NUCLEUS:13:西门子实时操作系统 Nucleus漏洞影响物联网设备等
  10. h5点击按钮之后按钮消失_小程序webview跳转页面后没有返回按钮完美解决方案
  11. 广告化开发(基础知识)~广告效果指标CTR/CVR/ROI/ARPU的理解
  12. 人机交互-8-交互式系统设计
  13. Atcoder Beginner Contest (ABC) 237 A - E
  14. Gstore官网学习三:快速入门
  15. NR协议学习——RLC
  16. 过期策略(TTL)与淘汰策略
  17. linux下使用tar命令解压.tar.gz文件是参数的说明
  18. js SM3 和 java SM3
  19. Windows版Sketch软件也太好用了吧!
  20. defaultbutton IE11下不起作用

热门文章

  1. php如何做直播api,网易云视频直播php版api
  2. Chrome 设置主页无效一直是2345
  3. 简单几步实现RTMP直播
  4. html字体标签设计,36个重要的HTML标签
  5. Tkinter(二) | 点击按钮显示图片
  6. Android 手机拨号
  7. 用java写修改器_一些修改器1
  8. 分享一个简单好看的科技公司官网模板-纯HTML+CSS
  9. 数据库之关系模型介绍
  10. 大专毕业,从6个月开发转入测试岗位的一些感悟——写在测试岗位3年之际