1、纵表转横表:
纵表结构 TableA
Name | Course | Grade |
张三 | 语文 | 75 |
张三 | 数学 | 80 |
张三 | 英语 | 90 |
李四 | 语文 | 95 |
李四 | 数学 | 55 |
横表结构 TableB
Name | 语文 | 数学 | 英语 |
张三 | 75 | 80 | 90 |
李四 | 95 | 55 | 0 |
方法一:
select Name,
sum(case Course when ‘语文‘ then Grade else 0 end) as 语文,
sum(case Course when ‘数学‘ then Grade else 0 end) as 数学,
sum(case Course when ‘英语‘ then Grade else 0 end) as 英语
from TableA
group by Name
2、横表转纵表的"SQL"示例
横表结构: TEST_H2Z
ID 姓名 语文 数学 英语
1 张三 80 90 70
2 李四 90 85 95
3 王五 88 75 90
转换后的表结构:
ID 姓名 科目 成绩
1 张三 语文 80
2 张三 数学 90
3 张三 英语 70
4 李四 语文 90
5 李四 数学 80
6 李四 英语 99
7 王五 语文 85
8 王五 数学 96
9 王五 英语 88
横表转纵表SQL示例:
SELECT 姓名,'语文' AS 科目,语文 AS 成绩 FROM TEST_H2Z UNION ALL
SELECT 姓名,'数学' AS 科目,数学 AS 成绩 FROM TEST_H2Z UNION ALL
SELECT 姓名,'英语' AS 科目,英语 AS 成绩 FROM TEST_H2Z
ORDER BY 姓名,科目 DESC;
-----------------------------------------------------------------
ACCESS 横表转纵表
最近在做一个用Access的东东,其中用到了case when的方式,但是Access是不支持这种语法的,查询知道IIf和Swith可以作为替代,总结如下:
IIf(expr, truepart, falsepart)
IIf 函数的语法含有下面这些命名参数:
部分 描述
expr 必要参数。用来判断真伪的表达式。
truepart 必要参数。如果 expr 为 True,则返回这部分的值或表达式。
falsepart 必要参数。如果 expr 为 False,则返回这部分的值或表达式。
实例:
SELECT Q_SellOut.*,
iif(sell_month='1' or sell_month='2' or sell_month='3','Q1',iif(sell_month='4' or sell_month='5' or sell_month='6','Q2',iif(sell_month='7' or sell_month='8' or sell_month='9','Q3',iif(sell_month='10' or sell_month='11' or sell_month='12','Q4','Error')))) as Acct_Quarter
FROM Q_SellOut;
以上实现是找出来某月属于哪个季度。
另外的Switch方式:
SELECT UserID,
UserName,
SWITCH(
Sex = 'f', '男',
Sex = 'm', '女',
True, '保密'
) AS SexName
from tUser
上述中最后一个Case为true,该用法类似于When Case语法中的Else。
例子:
SELECT tbf.smostid,sprojname,sunit, sum(IIf(iyear=2011,fpayout,0)) AS 2011年,sum(IIf(iyear=2012,fpayout,0)) AS 2012年,sum(IIf(iyear=2013,fpayout,0)) AS 2013年,sum(IIf(iyear=2014,fpayout,0)) AS 2014年
FROM tbf group by smostid,sprojname,sunit order by smostid;