SQL 中的 PIVOT 新手
New to PIVOT in SQL
我需要帮助来确定是否可以实现以下目标
我得到了一个 table 例如
是否可以使用 PIVOT sql 命令将其转换成这样
如果可以,有人可以帮助我。
您可以使用带联合的 select 创建一个新的 table。如果它需要相同 table 您可以删除旧的并从新的创建它。
select unique_id,'Q1' as 'Question', Q1_score as 'Score', Category
from table
union all
select unique_id,'Q2' as 'Question', Q2_score as 'Score', Category
from table
union all
select unique_id,'Q3' as 'Question', Q3_score as 'Score', Category
from table
order by unique_id, Question
--根据 Matthew Whited
将分组依据更改为排序依据
如果没有 UNPIVOT 关键字,您将不得不手动执行此转换。
SELECT *
FROM (
SELECT
[D].[UID]
,'Q1' AS [Question]
,[D].[Q1_Score] AS [Score]
,[D].[Category]
FROM [DataSet] AS [D]
UNION ALL
SELECT
[D].[UID]
,'Q2' AS [Question]
,[D].[Q2_Score] AS [Score]
,[D].[Category]
FROM [DataSet] AS [D]
UNION ALL
SELECT
[D].[UID]
,'Q3' AS [Question]
,[D].[Q3_Score] AS [Score]
,[D].[Category]
FROM [DataSet] AS [D]
) [upivot]
ORDER BY
[UID]
,[Question]
...如果您可以将 SQL 的新版本与 UNPIVOT 一起使用,那么您可以这样做...
SELECT
[UID]
,SUBSTRING([Question],1,2) AS [Question]
,[Score]
,[Category]
FROM [DataSet]
UNPIVOT (
[Score] FOR [Question] IN (
[Q1_Score]
,[Q2_Score]
,[Q3_Score]
)
) [upivot]
以上任一项的结果是这样的...
UID Question Score Category
1 Q1 10 Science
1 Q2 7 Science
1 Q3 5 Science
2 Q1 9 Maths
2 Q2 6 Maths
2 Q3 10 Maths
3 Q1 0 History
3 Q2 3 History
3 Q3 4 History
4 Q1 3 English
4 Q2 1 English
4 Q3 4 English
在前几天我的 post 中,我证明了上面看到的复杂 UNION ALL SELECT-s 是不必要的 - 如果您使用 in-line 进行交叉连接table 由与 un-pivot 的水平列数一样多的连续整数组成。它适用于任何支持 CROSS JOIN 和 CASE .. WHEN 子句的数据库:
垂直旋转和"un-pivoting"意思相同。
在这里,我把它做到了极致:
在这个post中,我un-pivot一个two-rowtable,然后对旋转数据做一些事情,然后re-pivot它。
玩的开心..
我需要帮助来确定是否可以实现以下目标
我得到了一个 table 例如
是否可以使用 PIVOT sql 命令将其转换成这样 如果可以,有人可以帮助我。
您可以使用带联合的 select 创建一个新的 table。如果它需要相同 table 您可以删除旧的并从新的创建它。
select unique_id,'Q1' as 'Question', Q1_score as 'Score', Category
from table
union all
select unique_id,'Q2' as 'Question', Q2_score as 'Score', Category
from table
union all
select unique_id,'Q3' as 'Question', Q3_score as 'Score', Category
from table
order by unique_id, Question
--根据 Matthew Whited
将分组依据更改为排序依据如果没有 UNPIVOT 关键字,您将不得不手动执行此转换。
SELECT *
FROM (
SELECT
[D].[UID]
,'Q1' AS [Question]
,[D].[Q1_Score] AS [Score]
,[D].[Category]
FROM [DataSet] AS [D]
UNION ALL
SELECT
[D].[UID]
,'Q2' AS [Question]
,[D].[Q2_Score] AS [Score]
,[D].[Category]
FROM [DataSet] AS [D]
UNION ALL
SELECT
[D].[UID]
,'Q3' AS [Question]
,[D].[Q3_Score] AS [Score]
,[D].[Category]
FROM [DataSet] AS [D]
) [upivot]
ORDER BY
[UID]
,[Question]
...如果您可以将 SQL 的新版本与 UNPIVOT 一起使用,那么您可以这样做...
SELECT
[UID]
,SUBSTRING([Question],1,2) AS [Question]
,[Score]
,[Category]
FROM [DataSet]
UNPIVOT (
[Score] FOR [Question] IN (
[Q1_Score]
,[Q2_Score]
,[Q3_Score]
)
) [upivot]
以上任一项的结果是这样的...
UID Question Score Category
1 Q1 10 Science
1 Q2 7 Science
1 Q3 5 Science
2 Q1 9 Maths
2 Q2 6 Maths
2 Q3 10 Maths
3 Q1 0 History
3 Q2 3 History
3 Q3 4 History
4 Q1 3 English
4 Q2 1 English
4 Q3 4 English
在前几天我的 post 中,我证明了上面看到的复杂 UNION ALL SELECT-s 是不必要的 - 如果您使用 in-line 进行交叉连接table 由与 un-pivot 的水平列数一样多的连续整数组成。它适用于任何支持 CROSS JOIN 和 CASE .. WHEN 子句的数据库:
垂直旋转和"un-pivoting"意思相同。
在这里,我把它做到了极致:
在这个post中,我un-pivot一个two-rowtable,然后对旋转数据做一些事情,然后re-pivot它。
玩的开心..