【问题标题】:Convert column name & value into rows name & row value in sql server 2008在 sql server 2008 中将列名和值转换为行名和行值
【发布时间】:2019-01-25 07:18:36
【问题描述】:

请查找以下屏幕截图以了解确切的问题。 我已经检查了所有与将列转换为行相关的解决方案,但我的问题有点不同。在这里,我想将列名和列值转换为行值,并将列值转换为行名。我非常感谢对解决方案的详细解释。

【问题讨论】:

标签: sql sql-server tsql transpose


【解决方案1】:

您可以尝试使用UNION ALL的条件加重功能

SELECT TYear,
       TMonth,
       'D1' Day,
       MAX(CASE WHEN USER = 'Sam' THEN D1 END) Sam,
       MAX(CASE WHEN USER = 'Rahul' THEN D1 END) Rahul
FROM tblCallAttend
GROUP BY TYear,
         TMonth
UNION ALL
SELECT TYear,
       TMonth,
       'D2' Day,
       MAX(CASE WHEN USER = 'Sam' THEN D2 END) Sam,
       MAX(CASE WHEN USER = 'Rahul' THEN D2 END) Rahul
FROM tblCallAttend
GROUP BY TYear,
         TMonth
SELECT TYear,
       TMonth,
       'D3' Day,
       MAX(CASE WHEN USER = 'Sam' THEN D3 END) Sam,
       MAX(CASE WHEN USER = 'Rahul' THEN D3 END) Rahul
FROM tblCallAttend
GROUP BY TYear,
         TMonth
.....

【讨论】:

    【解决方案2】:

    样本数据

    ;WITH CTE(Tyear,Tmonth,[User],d1,d2,d3,d4,d5)
    AS
    (
    SELECT 2019,'Jan','Sam',249,297,296,288,269 UNION ALL
    SELECT 2019,'Jan','Rahul',300,237,452,142,475
    )
    SELECT * INTO #Temp FROM CTE
    

    Sql 脚本

    SELECT [Tyear],Tmonth,Dayz,[Sam],[Rahul] 
    FROM
    (
    SELECT o.Tyear,
           o.Tmonth ,
           Dayz,
           dayval,
           dt.[User]
    FROM #Temp o
    CROSS APPLY ( VALUES ('d1',d1,[User]),('d2',d2,[User]),('d3',d3,[User]),('d4',d4,[User]),('d5',d5,[User])) 
    AS dt (Dayz,dayval,[User]) 
    )AS SRc
    PIVOT
    (
    MAX(dayval) FOR [User] IN ([Sam],[Rahul])
    )AS Pvt
    

    结果

    Tyear   Tmonth  Dayz    Sam  Rahul
    ----------------------------------
    2019    Jan     d1      249  300
    2019    Jan     d2      297  237
    2019    Jan     d3      296  452
    2019    Jan     d4      288  142
    2019    Jan     d5      269  475
    

    【讨论】:

      【解决方案3】:

      您想要取消透视数据。我建议为此进行横向连接,在 SQL Server 中意味着 apply 关键字:

      select ca.tyear, ca.tmonth, v.day,
             (case when ca.user = 'Sam' then v.val end) as Sam,
             (case when ca.user = 'Rahul' then v.val end) as Rahul
      from tblCallAttend ca cross apply
           (values ('D1', ca.d1),
                   ('D2', ca.d2),
                   ('D3', ca.d3),
                   ('D4', ca.d4),
                   ('D5', ca.d5)
           ) v(day, val)
      order by ca.tyear, ca.tmonth, v.day;
      

      横向连接非常强大。诸如反透视数据之类的问题是了解它们的便捷方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2023-03-21
        • 2018-09-03
        • 1970-01-01
        相关资源
        最近更新 更多