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它。

玩的开心..