【问题标题】:SQL return 1 row in results for each column in tableSQL 为表中的每一列在结果中返回 1 行
【发布时间】:2016-06-21 19:36:17
【问题描述】:

诚然,我不擅长使用 pivot/unpivot,但它似乎与比我正在寻找的更直接的“转置”有关。 我需要做的是为表中的一组列中的每一列创建一个结果集。

季度表:

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

【问题讨论】:

  • @MahediSabuj 谢谢,这绝对是完全相同的问题。在我看来,该问题的标题可以详细说明,目前就像需要知道问题的答案才能找到问题一样。绝对尝试用谷歌搜索很多不同的东西,但从未找到那个。感谢您的帮助。
  • 我没有足够的声誉来评论其他问题的答案,但我想知道是否有办法包含 NULL 值。

标签: sql sql-server tsql ssms-2014


【解决方案1】:

一种“有趣”的做法是使用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);

【讨论】:

  • 这实际上做得最好! Matt 的方法效果很好,但在一些位列上遇到了问题。
【解决方案2】:

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

Select Users 
     , Q 
     , V
FROM TableName
  UNPIVOT (
            V FOR Q IN (Q1,Q2,Q3,Q4)
           )up

【讨论】:

  • @Matt 我可以问你同样的问题吗?
  • @Matt 并不是说​​有太大区别,但是使用 SELECT * FROM (SELECT * FROM Tablename)... 而不仅仅是 SELECT * FROM Tablename .... 有什么意义?
  • 在我发布我的答案之前,我根本没有看到你的答案,它说在我们两个答案旁边 4 分钟
  • 我知道 M.Ali 我自己为我做过几次,这表明我比你领先一分钟,所以可能只是几秒钟 :) 我们将把它作为伟大的头脑想法一致:)
  • @Matt 所以,你是说这个答案是错误的?,因为它没有使用“内部选择语句”
【解决方案3】:

确保用于消除 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 - Include NULL using UNPIVOT) 当我想要包含交叉应用方法时,对我来说更有吸引力了。

在我看来,UNPIVOT 对你来说非常有用,因为你有一个已知数量的宿舍。

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

【讨论】:

  • 有什么方法可以包含空值?
  • stackoverflow.com/questions/1002989/… 似乎你可能想使用@Lamak cross apply 如果你想要空值,因为你必须稍微破解它才能通过 unpivot 得到它,但我会用一种方法更新我的答案去做吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多