1

诚然,我不擅长枢轴/反枢轴,但这似乎与我正在寻找的更直接的“转置”有关。我需要做的是为表中的一组列中的每一列创建一个包含 1 行的结果集。

宿舍表:

USER    Q1  Q2  Q3  Q4
-----------------------
USER1   1   5   3   3
USER2   2   1   1   8

期望的结果:

USER    Q   V
--------------
USER1   Q1  1
USER1   Q2  5
USER1   Q3  3
USER2   Q4  3
USER2   Q1  2
USER2   Q2  1
USER2   Q3  1
USER2   Q4  1
4

3 回答 3

4

一种“有趣”的做法是使用CROSS APPLY

SELECT  Q.[USER],
        X.Q,
        X.V
FROM dbo.Quarters Q
CROSS APPLY 
(
    VALUES
        ('Q1', t.Q1),
        ('Q2', t.Q2),
        ('Q3', t.Q3),
        ('Q4', t.Q4)
) X (Q, V);
于 2016-06-21T19:39:18.907 回答
3

使用UNPIVOT查询变得更加简单。使用 UNPIVOT,查询看起来像....

Select Users 
     , Q 
     , V
FROM TableName
  UNPIVOT (
            V FOR Q IN (Q1,Q2,Q3,Q4)
           )up
于 2016-06-21T19:44:02.090 回答
2

确保用于消除 null 的值未出现在您的数据集中!

SELECT
    [user]
    ,V = IIF(V = -99999,NULL,V)
    ,Q
FROM
    (
    SELECT
       [user]
       ,Q1 = ISNULL(t.Q1,-99999)
       ,Q2 = ISNULL(t.Q2,-99999)
       ,Q3 = ISNULL(t.Q3,-99999)
       ,Q4 = ISNULL(t.Q4,-99999)
    FROM
       @Table t) p

    UNPIVOT
       (V FOR Q IN (Q1,Q2,Q3,Q4)
       ) as unpvt

为了根据您的评论允许空值,必须使用 hack 将空值设置为其他值并将其放回空值。(SQL Server - 使用 UNPIVOT 包含 NULL)当想要包含交叉应用方法时,对我来说更具吸引力。

在我看来,UNPIVOT 对你来说很有用,因为你有一个已知数量的季度。

供参考的是 Mirosoft 在 PIVOT 和 UNPIVOT 上的网站的链接。https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

于 2016-06-21T19:43:10.560 回答