[转] SQL Server中的行列转换问题
原表结构
最终显示
序号 | 性别 | 部门 | 工资 |
1 | 男 | 部门a | 800 |
2 | 女 | 部门b | 900 |
3 | 男 | 部门a | 400 |
4 | 女 | 部门d | 1400 |
5 | 男 | 部门e | 1200 |
6 | 男 | 部门f | 500 |
7 | 女 | 部门a | 300 |
8 | 男 | 部门d | 1000 |
9 | 女 | 部门d | 1230 |
10 | 女 | 部门b | 2000 |
11 | 男 | 部门c | 2000 |
12 | 男 | 部门b | 1200 |
最终显示
部门名 | 人数 | 男 | 女 | 小于800元 | 从800至999 | 从1000元至1190元 | 大于1200元 |
部门a | 3 | 2 | 1 | 2 | 1 | 0 | 0 |
部门b | 3 | 1 | 2 | 0 | 1 | 0 | 2 |
部门c | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
部门d | 3 | 1 | 2 | 0 | 0 | 1 | 2 |
部门e | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
部门f | 1 | 1 | 0 | 1 | 0 | 0 | 0 |
SELECT 部门名,COUNT(序号) as 人数,
SUM(CASE 性别 WHEN 1 THEN 1 ELSE 0 END) as 男,
SUM(CASE 性别 WHEN 2 THEN 1 ELSE 0 END) as 女,
SUM(CASE SIGN(工资-800) WHEN -1 THEN 1 ELSE 0 END) as 小于800元,
SUM((CASE SIGN(工资-800)*SIGN(工资-1000) /*用*来实现<和>功能*/
WHEN -1 THEN 1 ELSE 0 END)+(CASE 工资
WHEN 800 THEN 1 ELSE 0 END)) as 从800至999, /*注意别名不能以数字开头*/
SUM((CASE SIGN(工资-1000)*SIGN(工资-1200)
WHEN -1 THEN 1 ELSE 0 END)+(CASE 工资
WHEN 1000 THEN 1 ELSE 0 END)) as 从1000元至1199元,
SUM((CASE SIGN(工资-1200) WHEN 1 THEN 1 ELSE 0 END)
+(CASE 工资 WHEN 1200 THEN 1 ELSE 0 END)) as 大于1200元
FroM 工资明细表
GROUP BY 部门名
SUM(CASE 性别 WHEN 1 THEN 1 ELSE 0 END) as 男,
SUM(CASE 性别 WHEN 2 THEN 1 ELSE 0 END) as 女,
SUM(CASE SIGN(工资-800) WHEN -1 THEN 1 ELSE 0 END) as 小于800元,
SUM((CASE SIGN(工资-800)*SIGN(工资-1000) /*用*来实现<和>功能*/
WHEN -1 THEN 1 ELSE 0 END)+(CASE 工资
WHEN 800 THEN 1 ELSE 0 END)) as 从800至999, /*注意别名不能以数字开头*/
SUM((CASE SIGN(工资-1000)*SIGN(工资-1200)
WHEN -1 THEN 1 ELSE 0 END)+(CASE 工资
WHEN 1000 THEN 1 ELSE 0 END)) as 从1000元至1199元,
SUM((CASE SIGN(工资-1200) WHEN 1 THEN 1 ELSE 0 END)
+(CASE 工资 WHEN 1200 THEN 1 ELSE 0 END)) as 大于1200元
FroM 工资明细表
GROUP BY 部门名