将某些列取消旋转到某些行

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 子句中过滤掉了它 那么如何从第二行获取值呢? Valueother 列的值吗?因此对于col 的值为'C304' 的行,Col_Value 的值是C304_Value 的值,ValueC305_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 解决方案

限制某些视图的自动旋转

如何使用 CAKeyframeAnimation 变换旋转检测某些旋转进度?

仅在设备旋转时旋转某些 UI 元素