【问题标题】:Convert tuple value to column names将元组值转换为列名
【发布时间】:2016-11-12 01:52:05
【问题描述】:

得到类似的东西:

+-------+------+-------+
| 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 分组,但您如何读取每个成绩列的计数值?

【问题讨论】:

  • 第一个表是查询的结果吗?如果是这样,也请显示您的原始表格结构,因为可能有更简单的解决方案来获得最终结果。
  • 是的!我有一些本质上可以给出 id、class、grade 的东西。我按 ID 和等级分组并计算其中的元组。

标签: sql postgresql group-by pivot crosstab


【解决方案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

【讨论】:

  • 这是关于 PostgreSQL,而不是 MS SQL。
  • 好的,但没有提到任何地方。它对 MS SQL 用户有帮助
  • 它被标记为 PostgreSQL。没有比这更清楚的了。此答案不适用。
【解决方案2】:

您需要一个“数据透视”表或“交叉表”。您可以结合使用聚合和CASE 语句,或者更优雅地使用附加模块tablefunc 提供的crosstab() 函数。这里的所有基础知识:

由于并非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);

【讨论】:

  • 为什么不简单地VALUES ('A'), ('B'), ('C'), ('D'), ('F') 而不是创建一个数组然后立即分解它?
  • @Patrick:因为它的语法更短,可用于多个项目。
  • IMO 一篇关于 crosstab/pivot/dynamic pivot 的文章应该写在文档部分。不幸的是我的英语不太好......
  • @Abelisto:也许吧。我还没有热身 SO“文档”的整个概念,它应该被称为“规范示例”之类的东西。 Postgres 有一个优秀的官方文档,项目会及时更新。我不相信我们应该在已建立的 SO 功能之外启动一个并行的 Postgres 文档。但这确实是关于元数据的讨论 - 并且已经在其中进行了很多的讨论。
  • 有没有不用交叉表的方法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2023-04-07
相关资源
最近更新 更多