【问题标题】:PostgreSQL multiple row as columnsPostgreSQL 多行作为列
【发布时间】:2018-07-27 11:39:04
【问题描述】:

我有一张这样的桌子:

| id | name | segment | date_created | question | answer |
|----|------|---------|--------------|----------|--------|
| 1  | John | 1       | 2018-01-01   | 10       | 28     |
| 1  | John | 1       | 2018-01-01   | 14       | 37     |
| 1  | John | 1       | 2018-01-01   | 9        | 83     |
| 2  | Jack | 3       | 2018-03-11   | 22       | 13     |
| 2  | Jack | 3       | 2018-03-11   | 23       | 16     |

我想在一行中显示这些信息,将所有问题和答案转换为列:

| id | name | segment | date_created | question_01 | answer_01 | question_02 | answer_02 | question_03 | answer_03 |
|----|------|---------|--------------|-------------|-----------|-------------|-----------|-------------|-----------|
| 1  | John | 1       | 2018-01-01   | 10          | 28        | 14          | 37        | 9           | 83        |
| 2  | Jack | 3       | 2018-03-11   | 22          | 13        | 23          | 16        |             |           |

同一 ID 的问题/答案数量是已知的。最多 15 个。

我已经尝试过使用交叉表,但它只接受一个值作为类别,我可以有 2 个(问题/答案)。任何帮助如何解决这个问题?

【问题讨论】:

  • 一个选项是常规数据透视查询。谷歌“SQL 数据透视查询”寻求帮助。我也认为交叉表可以在这里工作。

标签: sql postgresql pivot pivot-table crosstab


【解决方案1】:

您可以尝试在子查询中使用row_number 生成一个数字,然后在主查询中执行聚合函数条件。

SELECT  ID,
        Name,
        segment,
        date_created,
        max(CASE WHEN rn = 1 THEN question END) question_01 ,
        max(CASE WHEN rn = 1 THEN answer END) answer_01  ,
        max(CASE WHEN rn = 2 THEN question END) question_02, 
        max(CASE WHEN rn = 2 THEN answer END) answer_02,
        max(CASE WHEN rn = 3 THEN question END) question_03,
        max(CASE WHEN rn = 3 THEN answer END) answer_03
FROM (
    select *,Row_number() over(partition by ID,Name,segment,date_created order by (select 1)) rn
    from T
) t1
GROUP BY ID,Name,segment,date_created 

sqlfiddle

[结果]

| id | name | segment | date_created | question_01 | answer_01 | question_02 | answer_02 | question_03 | answer_03 |
|----|------|---------|--------------|-------------|-----------|-------------|-----------|-------------|-----------|
|  1 | John |       1 |   2018-01-01 |           1 |        28 |          14 |        37 |           9 |        83 |
|  2 | Jack |       3 |   2018-03-11 |          22 |        13 |          23 |        16 |      (null) |    (null) |

【讨论】:

  • 非常感谢。完美运行!
  • @Joel 很高兴为您提供帮助 :)
猜你喜欢
  • 1970-01-01
  • 2017-06-11
  • 2014-08-14
  • 2017-06-10
  • 1970-01-01
  • 2017-05-23
  • 2019-12-24
  • 2013-01-06
  • 1970-01-01
相关资源
最近更新 更多