SQL-列到行无枢轴

时间:2018-08-17 09:27:50

标签: sql sql-server subquery pivot

我正在寻找一种在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)。

请告诉我从哪里开始。谢谢

3 个答案:

答案 0 :(得分:4)

您可以尝试将CASE WHENMAX一起使用

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