如何在SQL中"flatten"一个table?
How to "flatten" a table in SQL?
我想对 table MyTable
进行查询,使用它的值来生成列。
在DATA_TYPE
列中,保证只有1
、2
和3
作为可能的值。
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
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
我想对 table MyTable
进行查询,使用它的值来生成列。
在DATA_TYPE
列中,保证只有1
、2
和3
作为可能的值。
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
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