将某些列取消旋转到某些行
Posted
技术标签:
【中文标题】将某些列取消旋转到某些行【英文标题】:Unpivot certain columns to certain row 【发布时间】:2021-04-08 10:39:36 【问题描述】:我有一个结构如下的表:
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'
【问题讨论】:
请解释逻辑。例如,UID 1226 发生了什么? 我刚刚在 where 子句中过滤掉了它 那么如何从第二行获取值呢?Value
是 other 列的值吗?因此对于col
的值为'C304'
的行,Col_Value
的值是C304_Value
的值,Value
是C305_Value
的值,但当col
具有C305
? 的值
@Larnu - 这是正确的
【参考方案1】:
我怀疑您只是想取消透视这些值。我不确定最后一列是什么,但基本思路是:
select t.id, t.uid, v.*
from t cross apply
(values ('C304', C304),
('C305', C305)
) v(col, col_value);
这不会返回您指定的结果,但我认为这是您想要做的。
如果最后一列只是“其他”值,您也可以将其包括在内:
select t.id, t.uid, v.*
from t cross apply
(values ('C304', C304, C305),
('C305', C305, C304)
) v(col, col_value, other_value);
【讨论】:
【参考方案2】:这是一些非常奇怪的逻辑,但是,这似乎是您所追求的。我更喜欢使用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;
【讨论】:
以上是关于将某些列取消旋转到某些行的主要内容,如果未能解决你的问题,请参考以下文章
如何保持某些列原样并动态旋转 SQL Server 2012 中的最后一列 [重复]
如何使用具有多个标题的 excel 源处理 SSIS 解决方案