【问题标题】:How to "flatten" a table in SQL?如何在 SQL 中“展平”表?
【发布时间】:2021-06-19 07:52:58
【问题描述】:

我想对表 MyTable 进行查询,该表使用其值来生成列。

DATA_TYPE 列中,保证只有123 作为可能的值。

MyTable:

CATEGORY     DATA_TYPE   DATA_CONTENT   OTHER_CONTENT
----------   ---------   ------------   -------------
CATEGORY A   1           CONTENT 1      OTHER 1    
CATEGORY A   2           CONTENT 2      OTHER 2    
CATEGORY A   3           CONTENT 3      OTHER 3    
CATEGORY B   1           CONTENT 1      OTHER 1    
CATEGORY B   2           CONTENT 2      OTHER 2    
CATEGORY B   3           CONTENT 3      OTHER 3    
CATEGORY C   1           CONTENT 1      OTHER 1    
CATEGORY C   2           CONTENT 2      OTHER 2    
CATEGORY C   3           CONTENT 3      OTHER 3    

这是想要的结果:

CATEGORY     DATA_TYPE_1   DATA_TYPE_2   DATA_TYPE_3   OTHER_1   OTHER_2   OTHER_3   
----------   -----------   -----------   -----------   -------   -------   -------   
CATEGORY A   CONTENT 1     CONTENT 2     CONTENT 3     OTHER 1   OTHER 2   OTHER 3   
CATEGORY B   CONTENT 1     CONTENT 2     CONTENT 3     OTHER 1   OTHER 2   OTHER 3   
CATEGORY C   CONTENT 1     CONTENT 2     CONTENT 3     OTHER 1   OTHER 2   OTHER 3   

【问题讨论】:

  • 您所追求的称为PIVOT(或UNPIVOT),但我不建议在 SQL 中这样做,因为数据的 显示 是关注您的表示层(例如 PHP),而不是 SQL(SQL 只关注获取 数据,它不适合列操作)
  • 您使用的是什么 DBMS(Sql Server、Oracle 等)?这将是某种类型的 PIVOT() 操作,但这些函数的语法和支持会因 DBMS 而异。
  • @dai 虽然当列数可变时为 true,但这是固定的列数。

标签: sql sql-server sql-server-2014


【解决方案1】:
SELECT
  category,
  MAX(CASE WHEN data_type = 1 THEN  data_content END)  AS data_type_1,
  MAX(CASE WHEN data_type = 2 THEN  data_content END)  AS data_type_2,
  MAX(CASE WHEN data_type = 3 THEN  data_content END)  AS data_type_3,
  MAX(CASE WHEN data_type = 1 THEN other_content END)  AS other_1,
  MAX(CASE WHEN data_type = 2 THEN other_content END)  AS other_2,
  MAX(CASE WHEN data_type = 3 THEN other_content END)  AS other_3
FROM
  myTable
GROUP BY
  category

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    相关资源
    最近更新 更多