将元组值转换为列名

时间:2016-11-12 01:52:05

标签: sql postgresql group-by pivot crosstab

有类似的东西:

+-------+------+-------+
| count |  id  | grade |
+-------+------+-------+
|     1 |    0 | A     |
|     2 |    0 | B     |
|     1 |    1 | F     |
|     3 |    1 | D     |
|     5 |    2 | B     |
|     1 |    2 | C     |

我需要:

+-----+---+----+---+---+---+
| id  | A | B  | C | D | F |
+-----+---+----+---+---+---+
|   0 | 1 |  2 | 0 | 0 | 0 |
|   1 | 0 |  0 | 0 | 1 | 1 |
|   2 | 0 |  5 | 1 | 0 | 0 |

我不知道我是否能做到这一点。我可以按ID进行分组,但您如何阅读每个成绩列的计数值?

2 个答案:

答案 0 :(得分:1)

CREATE TABLE #MyTable(_count INT,id INT , grade VARCHAR(10))

INSERT INTO #MyTable( _count ,id  , grade )
SELECT 1,0,'A' UNION ALL
SELECT 2,0,'B' UNION ALL
SELECT 1,1,'F' UNION ALL
SELECT 3,1,'D' UNION ALL
SELECT 5,2,'B' UNION ALL
SELECT 1,2,'C' 


SELECT *
FROM
(
 SELECT _count ,id  ,grade
 FROM #MyTable
)A
PIVOT
(
  MAX(_count) FOR grade IN ([A],[B],[C],[D],[F])
)P

答案 1 :(得分:0)

你需要一个" pivot"表格或"交叉制表"。您可以结合使用汇总和CASE语句,或者更优雅地使用附加模块crosstab()提供的 tablefunc 功能。所有基础知识都在这里:

由于并非grade中的所有键都有值,因此您需要2参数表单。像这样:

SELECT * FROM crosstab(
        'SELECT id, grade, count FROM table ORDER BY 1,2'
       , $$SELECT unnest('{A,B,C,D,F}'::text[])$$
       ) ct(id text, "A" int, "B" int, "C" int, "D" int, "F" int);