首页 > 解决方案 > 将某些列取消旋转到某些行

问题描述

我有一个具有以下结构的表:

ID 用户标识符 C304 C305 C304_值 C305_值
1 1225 86 01 15 99
2 1226 89 06 10 15

我希望输出类似于

ID 用户标识符 科尔 Col_Value 价值
1 1225 C304 86 99
1 1225 C305 89 15

我试过 unpivot,但它会重复每行的列。

有没有办法做到这一点?

这是我的 SQL:

SELECT UID, Col, Col_Value,
C304_Value, C305_Value
--,*
FROM Input
--Unpivot(  Field_Values    
--              for field IN ([dfdf])) as PVT
unpivot (
Col_Value
for Col in (C304, C305)
) up
where UID = '1225'

标签: sqlsql-serverunpivot

解决方案


这是一些非常奇怪的逻辑,但是,这似乎是您所追求的。我更喜欢使用VALUES表结构而不是更严格的UNPIVOT运算符:

CREATE TABLE dbo.YourTable (ID int,
                            UID int,
                            C304 int,
                            C305 int,
                            C304_Value int,
                            C305_Value int);
GO
INSERT INTO dbo.YourTable 
VALUES(1,1225,86,01,15,99),
      (2,1226,89,06,10,15);
GO

SELECT *
FROM dbo.YourTable;
GO

SELECT YT.ID,
       YT.UID,
       V.Col,
       V.Col_Value,
       V.[Value]
FROM dbo.YourTable YT
     CROSS APPLY (VALUES(N'C304',YT.C304_Value,YT.C305_Value),
                        (N'C305',YT.C305_Value,YT.C304_Value))V(Col,Col_Value,[Value])
WHERE YT.ID = 1;

GO
DROP TABLE dbo.YourTable;

推荐阅读