SQL Server - 将日期从一个表转移到另一个表
问题描述:
无法弄清楚如何将数据从一个表转置到另一个表。我使用光标吗? 样本数据:SQL Server - 将日期从一个表转移到另一个表
Build Part SN DateShipped A 1 123 2017-01-01 A 2 234 2017-02-02 A 3 345 2017-03-03 B 1 987 2017-01-01 B 2 876 2017-02-02 B 3 765 2017-03-03
所需的结果:
Build Part1SN Part1Ship Part2SN Part2Ship Part3SN Part3Ship A 123 2017-01-01 234 2017-02-02 345 2017-03-03 B 987 2017-01-01 876 2017-02-02 765 2017-03-03
答
你应该尝试使用数据透视表。
仅供参考请按照下面的链接
https://www.sqlshack.com/multiple-options-to-transposing-rows-into-columns/
答
因为你是在透视混合数据类型(日期& INT),我给一个动态透视的工作示例。在交叉申请中我们正在做什么的日期记录。
我也假设部分是构建内连续的,否则我们就需要应用/巢ROW_NUMBER()
例
Declare @SQL varchar(max) = '
Select *
From (
Select A.Build
,B.*
From YourTable A
Cross Apply (values (concat(''Part'',A.Part,''SN''), concat('''',A.SN))
,(concat(''Ship'',A.Part,''Ship''),concat('''',A.DateShipped))
) B (Item,Value)
) A
Pivot (max([Value]) For [Item] in (' + Stuff((Select ','+QuoteName(concat('Part',Part,'SN'))
+','+QuoteName(concat('Ship',Part,'Ship'))
From (Select Distinct Part From YourTable) A
Order By 1
For XML Path('')),1,1,'') + ')) p'
Exec(@SQL)
--Print @SQL
返回
生成的SQL看起来像这样
Select *
From (
Select A.Build
,B.*
From YourTable A
Cross Apply (values (concat('Part',A.Part,'SN'), concat('',A.SN))
,(concat('Ship',A.Part,'Ship'),concat('',A.DateShipped))
) B (Item,Value)
) A
Pivot (max([Value]) For [Item] in ([Part1SN],[Ship1Ship],[Part2SN],[Ship2Ship],[Part3SN],[Ship3Ship])) p
答
select Build,
max(case Part when 1 then SN end) 'Part1SN', max(case Part when 1 then DateShipped end) 'Part1Ship',
max(case Part when 2 then SN end) 'Part2SN', max(case Part when 2 then DateShipped end) 'Part2Ship',
max(case Part when 3 then SN end) 'Part3SN', max(case Part when 3 then DateShipped end) 'Part3Ship'
from TempTable
group by Build
您可以用做'PIVOT',如果您使用的是RDBMS,或*有条件聚集*支持。 SO中有很多例子。 –