[转] SQL Server中的行列转换问题
原表结构
最终显示
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 部门名
| 序号 | 性别 | 部门 | 工资 |
| 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 部门名

浙公网安备 33010602011771号