简体   繁体   English

SQL对表中的每一列在结果中返回1行

[英]SQL return 1 row in results for each column in table

Admittedly I'm not good with pivot/unpivot, but it seems like that relates to a more direct "transpose" than what I'm looking for. 诚然,我对数据透视表/非数据透视表并不满意,但是这似乎与我要查找的内容更直接的“移调”有关。 What I need to do is create a results set with 1 row for each of a set of columns in a table. 我需要做的是为表中的一组列中的每一列创建一个包含1行的结果集。

Quarters Table: 宿舍表:

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

Desired Results: 所需结果:

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

A "funny" way of do it would be using CROSS APPLY : 一种“有趣”的方式是使用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);

Using UNPIVOT the query becomes even simpler. 使用UNPIVOT ,查询变得更加简单。 with UNPIVOT the query would look something like.... 使用UNPIVOT,查询将类似于...。

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

make sure the value used to eliminate null is not represented in your dataset! 确保用于消除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

To allow for null's per your comment, have to use a hack to set a null value as something else and put it back to null. 为了让您的评论包含空值,必须使用骇客工具将空值设置为其他值,然后将其恢复为空值。 ( SQL Server - Include NULL using UNPIVOT ) When wanting to include the cross apply method becomes a little more attractive to me. SQL Server-使用UNPIVOT包含NULL )当想要包含交叉应用方法时,对我来说更具吸引力。

Seems to me UNPIVOT would work great for you seeing you have a known number of quarters. 在我看来,UNPIVOT对于您有已知数目的宿舍而言,将非常有用。

And for reference here is the link to Mirosoft's site on PIVOT and UNPIVOT. 作为参考,这里是指向Mirosoft PIVOT和UNPIVOT网站的链接。 https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx https://technet.microsoft.com/zh-CN/library/ms177410(v=sql.105).aspx

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM