【问题标题】:SQL create multiple columns based on distinct value of one columnSQL根据一列的不同值创建多列
【发布时间】:2018-08-21 15:47:18
【问题描述】:

我有一张像这样的表

-------------------------------
| col1 | col2 | count | value |
-------------------------------
| id1  | val1 | 1     |   2   | 
| id1  | val2 | 3     |   4   |
| id2  | val1 | 5     |   6   | 
| id2  | val2 | 7     |   8   |

....

我希望最终的结果是这样的

---------------------------------------------------------------
| col1 | val1_count| val1_value| val2_count | val2_value | ... 
---------------------------------------------------------------
| id1  | 1         |  2        |   3        |  4         | 
| id2  | 5         |  6        |   7        |  8         |
....

它几乎是 Excel 中的数据透视表或 Python/R 中的熔体/铸造,但是否有一个优雅的 SQL 解决方案来实现它?幸运的是,col2 只有两个不同的值 - val1, val2 但如果有解决方案可以扩展到除两个之外的多个值,那将是加分项。

更新,我正在使用 Hive 和 Impala(我都可以使用)

【问题讨论】:

  • 我删除了不兼容的 SQL 标签。有你声誉的人应该知道只标记你真正使用的数据库。
  • @GordonLinoff,谢谢。
  • @a_horse_with_no_name,我更新了帖子,我使用的是 Hive 和 Impala,而且桌子很大。

标签: sql hive pivot-table impala


【解决方案1】:

一种方法是

select col1, 
       max(case when col2 = 'val1' then count else null end) as val1_count,
       max(case when col2 = 'val1' then value else null end) as val1_value,
       max(case when col2 = 'val2' then count else null end) as val2_count,
       max(case when col2 = 'val2' then value else null end) as val2_value
from your_table
group by col1

【讨论】:

    【解决方案2】:

    一个简单的方法使用join:

    select t1.col1, t1.count as val1_count, t1.value as val1_value,
           t2.count as val2_count, t2.value as val2_value
    from t t1 left join
         t t2
         on t1.col1 = t2.col1 and t2.col2 = 'val2'
    where t1.col2 = 'val1';
    

    这是标准 SQL,应该适用于任何数据库。

    【讨论】:

      猜你喜欢
      • 2022-12-09
      • 2015-04-06
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 2015-12-02
      相关资源
      最近更新 更多