如何使用sql或t-sql将某些列转换为行
这是桌子如何使用sql或t-sql将某些列转换为行,sql,sql-server,pivot,pivot-table,Sql,Sql Server,Pivot,Pivot Table,这是桌子 Income|Expenses|Other|Department|Date 2k | 4k| .5k|Marketing |2014-05-28 52k | 7k| .1k|Sales |2014-04-01 结果 Description|Value|Department|Date Income | 2k|Marketing |2014-05-28 Expenses | 4k|Marketing |2014-05-28
Income|Expenses|Other|Department|Date
2k | 4k| .5k|Marketing |2014-05-28
52k | 7k| .1k|Sales |2014-04-01
结果
Description|Value|Department|Date
Income | 2k|Marketing |2014-05-28
Expenses | 4k|Marketing |2014-05-28
Other | .5k|Marketing |2014-05-28
Income | 52k|Sales |2014-04-01
Expenses | 7k|Sales |2014-04-01
Other | .1k|Sales |2014-04-01
实际上,我可以使用SELECT+UNION来获得结果,但需要使用Pivot
如何使用PIVOT函数获得此结果?您可以通过交叉应用取消PIVOT值
Select B.*
,A.Department
,A.Date
From YourTable A
Cross Apply ( values ('Income' ,Income )
,('Expences',Expenses)
,('Other' ,Other )
) B(Description,Value)
您可以使用应用程序:
您可以使用UNPIVOT
结果:
Description Value Department Date
----------------- -------------------- -------------------- ----------
Income 2k Marketing 2014-05-28
Expenses 4k Marketing 2014-05-28
Other .5k Marketing 2014-05-28
Income 52k Sales 2014-04-01
Expenses 7k Sales 2014-04-01
Other .1k Sales 2014-04-01
只是为了好玩,这里有一个小技巧,可以在不使用动态SQL或声明所有列的情况下动态地取消绑定数据
范例
返回
谢谢,这个很快。。。但是,如果收入、支出或其他的某些[价值]为零呢?它不接受具有空值的行。你怎么解决这个问题?不客气!UNPIVOT不考虑空值。在与unpivot一起使用之前,您需要将空值转换为空格或其他形式。回答很好,但在500k行的表上需要4秒。稍后我将尝试对此进行优化
DECLARE @SampleData TABLE (Income VARCHAR(20), Expenses VARCHAR(20), Other VARCHAR(20), Department VARCHAR(20), Date [Date])
INSERT INTO @SampleData VALUES
('2k ', '4k','.5k','Marketing','2014-05-28'),
('52k', '7k','.1k','Sales ','2014-04-01')
SELECT Description, Value, Department, Date
FROM @SampleData T
UNPIVOT ([Value] FOR [Description] IN ([Income], [Expenses], [Other])) AS UNPVT
Description Value Department Date
----------------- -------------------- -------------------- ----------
Income 2k Marketing 2014-05-28
Expenses 4k Marketing 2014-05-28
Other .5k Marketing 2014-05-28
Income 52k Sales 2014-04-01
Expenses 7k Sales 2014-04-01
Other .1k Sales 2014-04-01
Select Description = B.[Key]
,B.Value
,A.Department
,A.Date
From YourTable A
Cross Apply ( Select [Key]
,Value
From OpenJson( ( Select A.* for JSON Path,Without_Array_Wrapper) )
Where [Key] not in ('Department','Date')
) B
Description Value Department Date
Income 2k Marketing 2014-05-28
Expenses 4k Marketing 2014-05-28
Other .5k Marketing 2014-05-28
Income 52k Sales 2014-04-01
Expenses 7k Sales 2014-04-01
Other .1k Sales 2014-04-01