最近整理的一些行列转换sql(有自己的,有别人的),留作记录
--case when 经典用法
SELECT * FROM
(SELECT 1 NUM,
'奖项金额',
SUM(CASE WHEN DJMC= '一等奖' AND CGBZ=0 THEN DJJE ELSE 0 END) ,
SUM(CASE WHEN DJMC= '二等奖' AND CGBZ=0 THEN DJJE ELSE 0 END) ,
SUM(CASE WHEN DJMC= '三等奖' AND CGBZ=0 THEN DJJE ELSE 0 END) ,
SUM(CASE WHEN DJMC= '四等奖' AND CGBZ=0 THEN DJJE ELSE 0 END) ,
SUM(CASE WHEN DJMC= '五等奖' AND CGBZ=0 THEN DJJE ELSE 0 END) ,
SUM(CASE WHEN DJMC= '一等奖' AND CGBZ=1 THEN DJJE ELSE 0 END) ,
SUM(CASE WHEN DJMC= '二等奖' AND CGBZ=1 THEN DJJE ELSE 0 END) ,
SUM(CASE WHEN DJMC= '三等奖' AND CGBZ=1 THEN DJJE ELSE 0 END) ,
SUM(CASE WHEN DJMC= '四等奖' AND CGBZ=1 THEN DJJE ELSE 0 END) ,
SUM(CASE WHEN DJMC= '五等奖' AND CGBZ=1 THEN DJJE ELSE 0 END)
FROM XXDZMX T WHERE DZYF=20111129 AND ZFLX=0
UNION ALL
SELECT 2 NUM,
'奖项数量',
SUM(CASE WHEN DJMC= '一等奖' AND CGBZ=0 THEN 1 ELSE 0 END),
SUM(CASE WHEN DJMC= '二等奖' AND CGBZ=0 THEN 1 ELSE 0 END),
SUM(CASE WHEN DJMC= '三等奖' AND CGBZ=0 THEN 1 ELSE 0 END),
SUM(CASE WHEN DJMC= '四等奖' AND CGBZ=0 THEN 1 ELSE 0 END),
SUM(CASE WHEN DJMC= '五等奖' AND CGBZ=0 THEN 1 ELSE 0 END),
SUM(CASE WHEN DJMC= '一等奖' AND CGBZ=1 THEN 1 ELSE 0 END),
SUM(CASE WHEN DJMC= '二等奖' AND CGBZ=1 THEN 1 ELSE 0 END),
SUM(CASE WHEN DJMC= '三等奖' AND CGBZ=1 THEN 1 ELSE 0 END),
SUM(CASE WHEN DJMC= '四等奖' AND CGBZ=1 THEN 1 ELSE 0 END),
SUM(CASE WHEN DJMC= '五等奖' AND CGBZ=1 THEN 1 ELSE 0 END)
FROM XXDZMX T WHERE DZYF=20111129 AND ZFLX=0
) ORDER BY NUM;
--结果如下:
-- 1 奖项金额 0 50 10 0 2 200 0 10 5 2
-- 2 奖项数量 0 1 1 0 1 1 0 1 1 1
--初始数据如下:
SELECT ZJJX, SUM(CGSL), SUM(CGJEH), SUM(SBSL), SUM(SBJEH)
FROM (
SELECT ZJJX, COUNT(ZJJE) CGSL, SUM(ZJJE) CGJEH, 0 SBSL, 0 SBJEH FROM YW_ZJFPJL where substr(to_char(zjsj, 'yyyy-mm-dd hh24:mi:ss'), 0, 7) = '2016-10' GROUP BY ZJJX
UNION ALL
SELECT ZJJX, 0 CGSL, 0 CGJEH, COUNT(ZJJE) SBSL, SUM(ZJJE) SBJEH FROM YW_FJCWJL where substr(to_char(zjsj, 'yyyy-mm-dd hh24:mi:ss'), 0, 7) = '2016-10' GROUP BY ZJJX)
GROUP BY ZJJX;
/*
一等奖 1 200 0 0
三等奖 16 160 5 50
四等奖 28 140 23 115
五等奖 52 104 33 66
*/
--以下sql完成的哦
--奖项金额完成的
SELECT *
FROM (SELECT '奖项金额(成功)',
SUM(CASE WHEN ZJJX = '一等奖' THEN SUM(ZJJE) ELSE 0 END) 一等奖成功金额,
SUM(CASE WHEN ZJJX = '二等奖' THEN SUM(ZJJE) ELSE 0 END) 二等奖成功金额,
SUM(CASE WHEN ZJJX = '三等奖' THEN SUM(ZJJE) ELSE 0 END) 三等奖成功金额,
SUM(CASE WHEN ZJJX = '四等奖' THEN SUM(ZJJE) ELSE 0 END) 四等奖成功金额,
SUM(CASE WHEN ZJJX = '五等奖' THEN SUM(ZJJE) ELSE 0 END) 五等奖成功金额
FROM YW_ZJFPJL T WHERE to_char(zjsj,'yyyymmdd')='20161017' GROUP BY ZJJX),
(SELECT '奖项金额(失败)',
SUM(CASE WHEN ZJJX = '一等奖' THEN SUM(ZJJE) ELSE 0 END) 一等奖失败金额,
SUM(CASE WHEN ZJJX = '二等奖' THEN SUM(ZJJE) ELSE 0 END) 二等奖失败金额,
SUM(CASE WHEN ZJJX = '三等奖' THEN SUM(ZJJE) ELSE 0 END) 三等奖失败金额,
SUM(CASE WHEN ZJJX = '四等奖' THEN SUM(ZJJE) ELSE 0 END) 四等奖失败金额,
SUM(CASE WHEN ZJJX = '五等奖' THEN SUM(ZJJE) ELSE 0 END) 五等奖失败金额
FROM YW_FJCWJL T WHERE to_char(zjsj,'yyyymmdd')='20161017'
GROUP BY ZJJX);
--输出结果: 1 奖项金额(成功) 200 0 160 140 104 奖项金额(失败) 0 0 50 115 66
--奖项数量完成的
SELECT * FROM
(SELECT '奖项数量(成功)',
SUM(CASE WHEN ZJJX = '一等奖' THEN COUNT(ZJJE) ELSE 0 END) 一等奖成功数量,
SUM(CASE WHEN ZJJX = '二等奖' THEN COUNT(ZJJE) ELSE 0 END) 二等奖成功数量,
SUM(CASE WHEN ZJJX = '三等奖' THEN COUNT(ZJJE) ELSE 0 END) 三等奖成功数量,
SUM(CASE WHEN ZJJX = '四等奖' THEN COUNT(ZJJE) ELSE 0 END) 四等奖成功数量,
SUM(CASE WHEN ZJJX = '五等奖' THEN COUNT(ZJJE) ELSE 0 END) 五等奖成功数量
FROM YW_ZJFPJL T WHERE to_char(zjsj,'yyyymmdd')='20161017' GROUP BY ZJJX),
(SELECT '奖项数量(失败)',
SUM(CASE WHEN ZJJX = '一等奖' THEN COUNT(ZJJE) ELSE 0 END) 一等奖失败数量,
SUM(CASE WHEN ZJJX = '二等奖' THEN COUNT(ZJJE) ELSE 0 END) 二等奖失败数量,
SUM(CASE WHEN ZJJX = '三等奖' THEN COUNT(ZJJE) ELSE 0 END) 三等奖失败数量,
SUM(CASE WHEN ZJJX = '四等奖' THEN COUNT(ZJJE) ELSE 0 END) 四等奖失败数量,
SUM(CASE WHEN ZJJX = '五等奖' THEN COUNT(ZJJE) ELSE 0 END) 五等奖失败数量
FROM YW_FJCWJL T WHERE to_char(zjsj,'yyyymmdd')='20161017'
GROUP BY ZJJX);
--输出结果: 奖项数量(成功) 1 0 16 28 52 奖项数量(失败) 0 0 5 23 33
最近整理的一些行列转换sql(有自己的,有别人的),留作记录的更多相关文章
- 数据库行列转换sql
经常折腾数据库,常常遇到数据库行列转换的问题,下面就用一个小例子来演示下如何进行行列转换. 1.创建一张表 CREATE TABLE [android_source]( [CREATETIME] [d ...
- SqlServer2000下实现行列转换
SqlServer2000下实现行列转换 2011-04-06 22:07:07| 分类: SQL Server | 标签:sqlserver 2000 行列转换 sql |举报|字号 订 ...
- SQL Server中行列转换 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子
使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...
- SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句
原文出处:http://www.cnblogs.com/wy123/p/5933734.html 先看常用的一种表结构设计方式: 那么可能会遇到一种典型的查询方式,主子表关联,查询子表中的某些(或者全 ...
- SQL SERVER 合并重复行,行列转换
引用自:http://www.cnblogs.com/love-summer/archive/2012/03/27/2419778.html sql server2000 里面如何实现oracle10 ...
- SQL中PIVOT 行列转换
来源:http://www.studyofnet.com/news/295.html PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列 ...
- SQL pivot 基本用法 行列转换 数据透视
SQL通过pivot进行行列转换 数据透视 可直接在sql server 运行 传统操作 和 pivot create table XKCl (name nchar(10) not null, 学科 ...
- sql行列转换
首先我们建立一张表,名为scoreInfo,各个字段的设计如下图,分别是name,course,score,表示姓名,成绩与分数,如图所示.
随机推荐
- 关于SQL\SQL Server的三值逻辑简析
在SQL刚入门的时候,我们筛选为某列值为NULL的行,一般会采用如下的方式: SELECT * FROM Table AS T WHERE T.Col=NULL www.2cto.com 而实际 ...
- 读取编码为utf-16le的文件并打印
import codecs data = open('test.txt').read()if data[:2] == codecs.BOM_UTF16_LE: data = data[2:] ...
- JZ2440开发笔记(3)——配置TFTP
第一步: 1.关闭ubuntu的防火墙 ufw disable2.卸载了iptables apt-get remove iptables 1.用iptables -F这个命令来关闭防火 ...
- hive的安装步骤
在node2里安装一下hive1.2.1,步骤如下: 1.解压hive的安装包 2.改变目录:mv apache-hive-1.2.1-bin /home/install/hive-1.2 3.vi ...
- 关于mysql的error-based injection payload
今天用sqlmap扫一个网站,想得到一个表的所有列名,注意到sqlmap用到的一个error-based payload的: 1 AND (SELECT 3174 FROM(SELECT COUNT( ...
- bzoj 2707 [SDOI2012]走迷宫(SCC+高斯消元)
Description Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿 ...
- android智能家居在线语音控制
对于android 智能家居项目,如果能实现语音控制,无疑会丰富项目功能,改善用户体验,android语音识别的方法有三种:一是使用intent调用语音识别程序,二 是应用程序自己调用语音识别库,三是 ...
- localtime和localtime_r
上程序: #include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h ...
- Esper系列(十)NamedWindow语法delete、Select+Delete、Update
On-Delete With Named Windows 功能:在Named Windows中删除事件. 格式: 1 , 4 field_b = win.field_a, 5 field_ ...
- 辗转相除法求最大公约数和最小公倍数【gcd】
要求最小公倍数可先求出最大公约数 设要求两个数a,b的最大公约数 伪代码: int yushu,a,b: while(b不等于0) { yushu=a对b求余 b的值赋给a yushu的值赋给b } ...