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
SELECT
year,
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
FROM
statistic
GROUP BY
year -->查询结果:
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 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 m4
1991 1.1 1.2 1.3 1.4
1992 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 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
运行结果:

代码分解:
--方法1变形:将代码中的0改为1,计算SUM,看看会发生什么
SELECT
year,
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
FROM
statistic
GROUP BY
year -->查询结果:
year m1 m2 m3 m4
1991 4.1 4.2 4.3 4.4
1992 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 m4
1991 0 0 0 0
1992 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 m4
1991 1 1 1 1
1992 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 m4
1991 4.1 4.2 4.3 4.4
1992 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
T-SQL - 习题02_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式的更多相关文章
- Sql Server系列:数据表操作
表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...
- 使用Sql语句快速将数据表转换成实体类
开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...
- 【SQL Server】sql server更改了数据表的字段/新增数据表的字段 无法保存
sql server更改了数据表的字段/新增数据表的字段 无法保存 解决方法:进入 工具-->选项-->Designers-->表设计器和数据库设计器-->取消勾选 即可
- 定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证
背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.N ...
- Sql中如何将数据表的两个字段的值如何互换?
今天遇到一个数据表的两个列数据要互换,在网上找到并记录下. 直接用Sql就可以搞定,语法如下 --将数据表中两个列数据互换的语法-- update tabName set field1=field2, ...
- C# 如何获取SQL Server 中指定数据表的所有字段名和字段类型
如何获取指定数据表的所有字段名和字段类型.SqlConnection.GetSchema方法有2个重载形式,获取指定数据表的所有字段名和字段类型的秘密就在GetSchema (String, Stri ...
- sql server返回插入数据表的id,和插入时间
假设要插入数据的数据表结构如下
- SQL第二课-创建数据表
查看有多少数据库 SHOW DATABASES; 进入数据库:USE <数据库名> 举例:USE test;//进入test数据库 查看当前进入的是哪个数据库 SELECT DATABAS ...
- My SQL随记 003 数据表基础操作语法
数据表 查看数据表 修改表名 修改字段名 修改字段数据类型 添加删除-字段 约束(主外键默认检查) 查看表结构: 语法:DESRIBE(描述) table_Name; DESC table_Name ...
随机推荐
- PL SQL Developer 13连接Oracle数据库并导出数据
下载 并安装 PL SQL Developer 13,默认支持中文语言 ============================= 注册码: product code: 4vkjwhfeh3ufnqn ...
- JS 之循环 应用案例1
应用场景:将el-select下拉框的lab值,显示在下面的详情text框,见下图 用到了 el-select 传值,js循环判断options.code是否等于传进来的值,等于就break; tex ...
- Java集合框架全解
Collection 集合 集合接口有2个基本方法: public interface Collection<E> { //向集合中添加元素.如果添加元素确实改变了集合就返回 true, ...
- 如何临时发布部署Cocos小游戏到Linux服务器,让别人能在微信打开
两个星期前,我们发布了第一个小游戏教程: 教程:制作一个小游戏送给喜欢的TA(不会编程也能学会哦) 上周有好几位小伙伴在b站催更,呃,作为小透明,收到催更信息后还是很激动的!竟然有同学在看我们的小教程 ...
- 使用Python玩转阿里云盘
项目地址: https://github.com/foyoux/aligo 这个项目起源于我的一个简单需求, 我有25000个文件, 已经上传了9000个, 但是现在我把这些文件重新整理了, 最后我不 ...
- Js实现随机某个li样式增加
一.首先引入jquery cdn 二.基础样式 三.目的 为了使随机某个li背后有个旋转的图片 四.核心代码 html代码: <div class="bg3"> ...
- 2021大厂Android面试高频100题最新汇总(附答案详解)
前言 现在越来越多的人应聘工作时都得先刷个几十百来道题,不刷题感觉都过不了面试. 无论是前后端.移动开发,好像都得刷题,这么多人通过刷题过了面试,说明刷题对于找工作还是有帮助的. 不过这其中有一个问题 ...
- java中sort方法的自定义比较器写法(转载)
java中sort方法的自定义比较器写法 摘要 在做一些算法题时常常会需要对数组.自定义对象.集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collecti ...
- 跟我一起写 Makefile(十)
四.foreach 函数 foreach函数和别的函数非常的不一样.因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell(/bin/sh)中的for语 ...
- 管理员权限的窗口,收不到WM_COPYDATA
windows用户界面特权隔离 一个运行在较低特权等级的应用程序的行为就受到了诸多限制,它不可以: 验证由较高特权等级进程创建的窗口句柄 通过调用SendMessage和PostMessage向由较高 ...