今天给公司同事们出了一道例行考试题,要求写一句SQL语句从上面表转换为下面表,经过艰难思索,一个同事做了出来。

小区             总数    A类车 B类车 C类车
建业森林半岛     210     100    30      80
万科城          200   50    60      90
丰乐园           210      30    70      110

车类型    总数    建业森林半岛 万科城  丰乐园
A类车      180       100       50       30
B类车    160        30       60       70
C类车      280        80       90       110

 
建表
  1. CREATE TABLE `myc` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `housing` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
  4. `all_car` int(11) DEFAULT NULL,
  5. `a_car` int(11) DEFAULT NULL,
  6. `b_car` int(11) DEFAULT NULL,
  7. `c_car` int(11) DEFAULT NULL,
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
  10.  
  11. -- ----------------------------
  12. -- Records of myc
  13. -- ----------------------------
  14. INSERT INTO `myc` VALUES ('1', 'senlinbandao', '210', '100', '30', '80');
  15. INSERT INTO `myc` VALUES ('2', 'wanke', '200', '50', '60', '90');
  16. INSERT INTO `myc` VALUES ('3', 'fengle', '210', '30', '70', '110');
  1. id housing all_car a_car b_car c_car
  2. 1 senlinbandao 210 100 30 80
  3. 2 wanke 200 50 60 90
  4. 3 fengle 210 30 70 110

  

  

 
SQL语句如下:
  1. SELECT
  2.  
  3. c2 AS '车类型',
  4.  
  5. IF(c2='A类车',(SELECT SUM(a_car) FROM MYC),IF(c2='B类车',(SELECT SUM(b_car) FROM MYC),IF(c2='C类车',(SELECT SUM(c_car) FROM MYC),0))) AS '总数',
  6.  
  7. SUM(IF(c1='senlinbandao',c3,0)) AS '建业森林半岛',
  8.  
  9. SUM(IF(c1='wanke',c3,0)) AS '万科城',
  10.  
  11. SUM(IF(c1='fengle',c3,0)) AS '丰乐园'
  12. from(
  13.  
  14. select housing as c1,'A类车' as c2,a_car as c3 from MYC
  15. Union
  16.  
  17. select housing,'B类车' as c2,b_car from MYC
  18.  
  19. Union
  20.  
  21. select housing,'C类车' as c2,c_car from MYC
  22. ) AS tx group by c2;
  1. 第二种写法
  1. SELECT
  2. 'a_car' 车类型,
  3. MAX(CASE housing WHEN 'senlinbandao' THEN a_car ELSE 0 END ) 建业森林半岛,
  4. MAX(CASE housing WHEN 'wanke' THEN a_car ELSE 0 END ) 万科城 ,
  5. MAX(CASE housing WHEN 'fengle' THEN a_car ELSE 0 END ) 丰乐园,
  6. SUM(a_car) 总数
  7. FROM myc
  8. UNION
  9. SELECT
  10. 'b_car' 车类型,
  11. MAX(CASE housing WHEN 'senlinbandao' THEN b_car ELSE 0 END ) 建业森林半岛,
  12. MAX(CASE housing WHEN 'wanke' THEN b_car ELSE 0 END ) 万科城 ,
  13. MAX(CASE housing WHEN 'fengle' THEN b_car ELSE 0 END ) 丰乐园,
  14. SUM(b_car) 总数
  15. FROM myc
  16. UNION
  17. SELECT
  18. 'b_car' 车类型,
  19. MAX(CASE housing WHEN 'senlinbandao' THEN c_car ELSE 0 END ) 建业森林半岛,
  20. MAX(CASE housing WHEN 'wanke' THEN c_car ELSE 0 END ) 万科城 ,
  21. MAX(CASE housing WHEN 'fengle' THEN c_car ELSE 0 END ) 丰乐园,
  22. SUM(c_car) 总数
  23. FROM myc

  

SQL行列转置的更多相关文章

  1. SQL 行列转置

    ),),[Score] int) Insert Class union all union all union all union all union all union all union all ...

  2. SQL 行列倒置

    SQL的的行列倒置已经不是新知识了,但在博主的技术咨询期间,仍发现其实有很多人并不了解这块,所以在此专门写一篇博客记录.本文将以Mysql为例,并以数据采集指标信息获取为例子.在下面的例子,你可以在s ...

  3. 简化实现动态行列转置的SQL

    动态行列转换的计算在实际业务中非经常见,网上各类技术论坛上都有讨论,比方以下这些问题: http://www.iteye.com/problems/87788 http://bbs.csdn.net/ ...

  4. 使用SQL SERVER PIVOT实现行列转置

    一般我们在使用SQL语句实现行列转置时候,最常用的方法无外乎就是 case语句来实现,但是如果需要需要转置的列太多,那么case起来语句就无限庞大,十分不方便,sql server中的PIVOT就可以 ...

  5. SQL动态长度行列转置

    一,案列问题描述: 某销售系统中,注册的用户会在随后的月份中购物下单,需要按月统计注册的用户中各个月下单的金额.源数据表如下: FM::注册月份,CM: 下单月份, AMT:下单金额 期望得到如下统计 ...

  6. 用powershell+excel行列转置三步走

    本文重点讲解第一步,手动在excel表中输入公式,或者用powershell自动输入公式. 第二步,用powershell向excel中写入数据,略. 第三步,用powershell从excel中读取 ...

  7. Oracle 行列转置

    两种简单的行列转置 1.固定列数的行列转换如student   subject    grade--------- ---------- --------student1  语文       80st ...

  8. 数据透视表sql:用SQL行列转换实现数据透视的一些思考

    用SQL行列转换实现数据透视的一些思考 摘要:根据对报表开发过程中碰到的需要用SQL行列转换进行解决的一类查询统计问题的分析,逐步探索求解得到一种较通用的解决思路,并用函数进行实现.该解决思路及函数实 ...

  9. HAWQ中的行列转置

    行列转置是ETL或报表系统中的常见需求,HAWQ提供的内建函数和过程语言编程功能,使行列转置操作的实现变得更为简单. 一.行转列 1. 固定列数的行转列 原始数据如下: test=# select * ...

随机推荐

  1. 【THUWC2017】随机二分图(动态规划)

    [THUWC2017]随机二分图(动态规划) 题面 BZOJ 洛谷 题解 如果每天边的限制都是\(0.5\)的概率出现或者不出现的话,可以把边按照二分图左侧的点的编号排序,然后设\(f[i][S]\) ...

  2. 外围功能电路控制 LET′S TRY“嵌入式编程”: 4 of 6

    外围功能电路控制 LET′S TRY“嵌入式编程”: 4 of 6 本连载讲解作为嵌入式系统开发技术人员所必需具备的单片机的基础知识. 在<单片机入门(1)-(3)>中,我们一起学习了单片 ...

  3. js 读取包含特殊字符的属性值

    在JS中对象的属性可以通过两种方式访问:object.property和object["property"]. 包含特殊字符的属性只能以此方式访问: object["pr ...

  4. CF747F Igor and Interesting Numbers

    我佛了,这CF居然没有官方题解. 题意:给定k,t,求第k小的16进制数,满足每个数码的出现次数不超过t. 解: 每个数都有个出现次数限制,搞不倒.一开始想到了排序hash数位DP,不过写了写觉得不胜 ...

  5. Java 接口篇

    为什么使用接口? 问题 要求实现防盗门的功能 分析 门有开和关的功能,锁有上锁和开锁的功能 将门和锁分别定义为抽奖类 那么问题就是防盗门即继承了门的同时又继承了锁,而Java的继承是单继承,接口可多继 ...

  6. PHP选择排序算法

    说明: 通过假设一个最小数的key,来逐个比较后面的值,如果假设的值大于后面的值,则互换位置. 示例: <?php $a = array(2,13,42,34,56,23,67,365,8766 ...

  7. django跨域请求问题

    一 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之 ...

  8. struts2 二: 参数封装

    封装请求正文到对象中(非常重要) 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. struts.xml的编写: <action name=&quo ...

  9. jenkins学习:jenkins+gitlab

    配置前提: 1.Jenkins已安装git plugin,gitlab plugin,安装过程可参考 https://www.cnblogs.com/zhizhiyin/p/9138309.html ...

  10. SSH框架学习环境配置

    1.      java环境 安装 安装jdk7,根据自己的操作系统选择32位或64位安装. 配置 安装后需要配置环境变量,如下所示: 配置classpath,如下: 并在path中添加java6安装 ...