将某些列反透视到特定行
Unpivot certain columns to certain row
我有一个 table 结构如下:
ID
UID
C304
C305
C304_Value
C305_Value
1
1225
86
01
15
99
2
1226
89
06
10
15
我希望输出类似于
ID
UID
Col
Col_Value
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'
我怀疑您只是想对值进行逆透视。我不确定最后一列是什么,但基本思路是:
select t.id, t.uid, v.*
from t cross apply
(values ('C304', C304),
('C305', C305)
) v(col, col_value);
这不是 return 您指定的结果,但我认为这是您想要做的。
如果最后一列只是“其他”值,您也可以包括它:
select t.id, t.uid, v.*
from t cross apply
(values ('C304', C304, C305),
('C305', C305, C304)
) v(col, col_value, other_value);
这是一些非常奇怪的逻辑,但是,这似乎就是您所追求的。不过,我更喜欢使用 VALUES
table 构造,而不是更具限制性的 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;
我有一个 table 结构如下:
ID | UID | C304 | C305 | C304_Value | C305_Value |
---|---|---|---|---|---|
1 | 1225 | 86 | 01 | 15 | 99 |
2 | 1226 | 89 | 06 | 10 | 15 |
我希望输出类似于
ID | UID | Col | Col_Value | 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'
我怀疑您只是想对值进行逆透视。我不确定最后一列是什么,但基本思路是:
select t.id, t.uid, v.*
from t cross apply
(values ('C304', C304),
('C305', C305)
) v(col, col_value);
这不是 return 您指定的结果,但我认为这是您想要做的。
如果最后一列只是“其他”值,您也可以包括它:
select t.id, t.uid, v.*
from t cross apply
(values ('C304', C304, C305),
('C305', C305, C304)
) v(col, col_value, other_value);
这是一些非常奇怪的逻辑,但是,这似乎就是您所追求的。不过,我更喜欢使用 VALUES
table 构造,而不是更具限制性的 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;