• 时间: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的样式的更多相关文章

  1. Sql Server系列:数据表操作

    表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...

  2. 使用Sql语句快速将数据表转换成实体类

    开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...

  3. 【SQL Server】sql server更改了数据表的字段/新增数据表的字段 无法保存

    sql server更改了数据表的字段/新增数据表的字段  无法保存 解决方法:进入 工具-->选项-->Designers-->表设计器和数据库设计器-->取消勾选   即可

  4. 定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证

    背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.N ...

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

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

  6. C# 如何获取SQL Server 中指定数据表的所有字段名和字段类型

    如何获取指定数据表的所有字段名和字段类型.SqlConnection.GetSchema方法有2个重载形式,获取指定数据表的所有字段名和字段类型的秘密就在GetSchema (String, Stri ...

  7. sql server返回插入数据表的id,和插入时间

    假设要插入数据的数据表结构如下

  8. SQL第二课-创建数据表

    查看有多少数据库 SHOW DATABASES; 进入数据库:USE <数据库名> 举例:USE test;//进入test数据库 查看当前进入的是哪个数据库 SELECT DATABAS ...

  9. My SQL随记 003 数据表基础操作语法

    数据表 查看数据表 修改表名 修改字段名 修改字段数据类型 添加删除-字段 约束(主外键默认检查) 查看表结构: 语法:DESRIBE(描述) table_Name; DESC  table_Name ...

随机推荐

  1. 一张图概括mysql的各种join用法

  2. spring boot(二)整合mybatis plus+ 分页插件 + 代码生成

    先创建spring boot项目,不知道怎么创建项目的 可以看我上一篇文章 用到的环境 JDK8 .maven.lombok.mysql 5.7 swagger 是为了方便接口测试 一.Spring ...

  3. 前端基础html(二)

    一.html的概念 1.概念:超文本标记语言. 2.超文本,超链接:超级不仅有文本,图片,还有音频,视频等. 3.html:作用:   显示服务器端的响应结果. 二.互联网三大基石 1.url:统一资 ...

  4. 深入刨析tomcat 之---第8篇 how tomcat works 第11章 11.9应用程序,自定义Filter,及注册

    writed by 张艳涛, 标签:全网独一份, 自定义一个Filter 起因:在学习深入刨析tomcat的学习中,第11章,说了调用过滤链的原理,但没有给出实例来,自己经过分析,给出来了一个Filt ...

  5. create-react-app 创建的项目执行npm run eject后,运行报错

    create-react-app 创建的项目执行npm run eject后,运行报错:Cannot find module '@babel/plugin-transform-react-jsx-so ...

  6. centos安装ansible

    此次测试总共有三台机,分别如下: ansible服务器:10.0.0.20 client01:10.0.0.21 client02:10.0.0.22 一.安装ansible 方法一. yum ins ...

  7. Linux必知必会的命令全集(持续更新)

    Linux有超过五百多种命令,每个命令还有十几二十种选项,令人抓狂,本文旨在整理本人工作常用的Linux命令,希望对大家有所帮助! 1.cd 跳转文件夹 最常用的命令,没有之一. cd    # 进入 ...

  8. [CISCN2019 华北赛区 Day2 Web1]Hack World(二分法写布尔注入脚本)

    记一道布尔注入的题,存在过滤字符. 从题目看应该是一道注入题.提示存在flag表flag列. 输入1和2的返回结果不一样,可能是布尔注入. 简单用万能密码尝试了一下.提示SQL Injection C ...

  9. 开源分享:谷歌大佬联合打造《高级Kotlin强化实战(附Demo)》

    Kotlin 以其简洁的特性而闻名,而在我们的实践中,更加简洁就意味着更加高效.事实上,在使用 Kotlin 的专业 Android 开发者中,有多达 67% 的人表示 Kotlin 已经帮助他们提升 ...

  10. Logback 快速入门 / 使用详解

    官方文档: http://logback.qos.ch/manual/index.html 一.简介 Java 开源日志框架,以继承改善 log4j 为目的而生,是 log4j 创始人 Ceki Gü ...