InterviewQuestion_SQLServer_Probl_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式

题目:有个年度统计表,结构如下:

怎么样把这个表,查询成这样一个结果:

这是在面试过程中遇到的一个关于数据库的题,没有一点思路,不知它考查到的知识点是什么,如何下手?

网上搜了一下,有哥们儿说这是典型的“行转列问题”,好像用到“交叉表查询”,下面看看具体的代码!

文件: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

时间: 2024-10-29 19:07:27

InterviewQuestion_SQLServer_Probl_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式的相关文章

以面向对象的思想实现数据表的添加和查询,JDBC代码超详细

以面向对象的思想编写JDBC程序,实现使用java程序向数据表中添加学生信息,并且可以实现给定×××号查询学生信息或给定准考证号查询学生信息. 创建的数据表如下: CREATE TABLE EXAMSTUDENT(FlowID INTEGER,Type INTEGER,IDCard VARCHAR(18),ExamCard VARCHAR(15),StudentName VARCHAR(20),Location VARCHAR(20),Grade INTEGER);1.首先实现通过java程序在

php标签云制作——数据表的结构和查询方法

1.数据表的结构: 创建建两张数据表,结构如下: 标签tag表: 文章mood表: 其中mood表中的tag字段,以tag表的id字段+“,”+tag表的id字段, 2.查询方法: 例如:如果需要某篇文章中包含tag表中的id为1,2,3的tagname,也就是id为1,2,3的标签, 则在添加文章的时候用 $result=implode(",", $_POST['tagid']);//把获取的checkbox的数组用逗号进行分割 $_POST['tagid']为获取前台的复选框的数组

数据库、数据表的基本操作及查询数据

数据库的基本操作 创建数据库 CREATE DATABASE database_name database_name为要创建的数据库的名称 删除数据库 DROP DATABASE database_name database_name为要删除的数据库的名称 数据库存储引擎 数据库存储引擎是数据库底层软件组成,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据操作. MySQL的核心就是存储引擎. 存储引擎比较 |功能|MyISAM|Memory|InnoDB|Archive|

Oracle中使用游标获取指定数据表的所有字段名对应的字符串

操作步骤:打开PLSQL Developer后,直接执行下面的语句就可以出来 --Oracle中使用游标获取指定数据表的所有字段名对应的字符串 declare mytablename VARCHAR(255):='STAFFDOC'; --定义要查询的数据表名变量,STAFFDOC为我测试用的数据表名,请修改成您的数据库中的对应数据表名字mystring NVARCHAR2(4000):=''; --定义要输出的字符串变量 cursor mycursor is --定义游标          s

SQLite学习手册(数据表和视图)

如何列出SQLite数据库中的所有表 SQLite数据库中的信息存在于一个内置表sqlite_master中,在查询器中可以用 select * from sqlite_master 来查看,如果只要列出所有表名的话,则只要一个语句: SELECT name FROM sqlite_master WHERE type='table' order by name,因为表的列type固定为'table' 一.创建数据表: 该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方

数据表和视图

一.创建数据表: 该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示SQLite中创建表的各种规则.但是对于一些SQLite特有的规则,我们会给予额外的说明.注:以下所有示例均是在sqlite自带命令行工具中完成的.    1). 最简单的数据表:    sqlite> CREATE TABLE testtable (first_col integer);    这里需要说明的是,对于自定义数据表表名,如testtable,不能以sqlite_开头,因为以该前

SQLite数据表和视图

一.创建数据表: 该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示SQLite中创建表的各种规则.但是对于一些SQLite特有的规则,我们会给予额外的说明.注:以下所有示例均是在sqlite自带命令行工具中完成的. 1). 最简单的数据表: sqlite> CREATE TABLE testtable (first_col integer); 这里需要说明的是,对于自定义数据表表名,如testtable,不能以sqlite_开头,因为以该前缀定义的表名都用于

MySQL数据表查询操作

准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!/* SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重 {* | 表名.* | 表名.字段名[ AS 别名][,...]} 指定查询出的字段的 FROM 表名[AS 别名][,表1... AS 别名] [INNER | [LEFT | RIGHT] [OUTER] JOIN 另一张表名 [AS 别名] ON 关联条件] [WHERE 条件] [GROUP BY 分组字段[,...]] [H

MySQL(九)之数据表的查询详解(SELECT语法)二

上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1)创建数据表suppliers 前面已经有一张表是book表,我们在建立一张suppliers(供应商)表和前面的book表对应. 也就是说 让book中s_id字段值指向suppliers的主键值,创建一个外键约束关系. 其实这里并没有达到真正的外键约束关系,只是模拟,让fruits中的s_id中