我正在寻找一种在SQL Server中将行转换为列的有效方法。我听说PIVOT可以实现此目的。但是我的用例有些不同。
实际表格:
----------------------------------------
| Id |Category| Part1 |Part2 |Part3 |
----------------------------------------
| 1 |A |5 |0 |0 |
| 1 |B |0 |1 |3 |
| 1 |C |0 |0 |0 |
| 1 |D |0 |0 |0 |
----------------------------------------
我正在寻找的结果:
---------------------------------------------------------
| Id |Category| xxx |yyyyy |zzzzz |ffffff |hhhhh |
---------------------------------------------------------
| 1 |A |5 |B |1 |B |3 |
---------------------------------------------------------
有可能实现吗?我也在考虑子查询(https://www.dofactory.com/sql/subquery)。
请告诉我从哪里开始。谢谢
答案 0 :(得分:4)
您可以尝试将CASE WHEN
与MAX
一起使用
SELECT ID,
MAX(CASE WHEN Part1 > 0 then Category end) 'Category',
MAX(Part1) 'xxx',
MAX(CASE WHEN Part2 > 0 then Category end) 'yyyyy',
MAX(Part2) 'zzzzz',
MAX(CASE WHEN Part3 > 0 then Category end) 'ffffff',
MAX(Part3) 'hhhhh'
FROM T
GROUP BY ID
Results :
| ID | Category | xxx | yyyyy | zzzzz | ffffff | hhhhh |
|----|----------|-----|-------|-------|--------|-------|
| 1 | A | 5 | B | 1 | B | 3 |
如果要在part
列中求和。您可以使用SUM
函数代替MAX
SELECT ID,
MAX(CASE WHEN Part1 > 0 then Category end) 'Category',
SUM(Part1) 'xxx',
MAX(CASE WHEN Part2 > 0 then Category end) 'yyyyy',
SUM(Part2) 'zzzzz',
MAX(CASE WHEN Part3 > 0 then Category end) 'ffffff',
SUM(Part3) 'hhhhh'
FROM T
GROUP BY ID
Results :
| ID | Category | xxx | yyyyy | zzzzz | ffffff | hhhhh |
|----|----------|-----|-------|-------|--------|-------|
| 1 | A | 5 | B | 1 | B | 3 |
答案 1 :(得分:0)
效率不高,但是如果我必须这样做,我会使用Id字段多次(与其他一些列一起)自我合并(与自身合并)以获得所需的答案。
正如我之前所说,这不是一个很好的解决方案,但应该可以。
答案 2 :(得分:0)
请尝试以下情况:
select id, case when category='A' then category end as category, max(Part1) as xxx,case when category='B' then category end as yyyyy,
max(part2) as zzzzz,
case when category='C' then category end as ffffff,
max(part3) as hhhhh
from tablename
group by case when category='A' then category end, case when category='B' then category end, case when category='C' then category end