2017-06-29 81 views
-1

我必须使用T-SQL解除数据规范化,我尝试使用unpivot函数。但它像这样返回输出。我需要一个不同的输出,请建议步骤。谢谢。SQL Server高级非规范化

product class type Value 
---------------------------------- 
prod1 classA AFD  2 
prod1 classA AFD_TS 6/29/2017 
prod1 classA CCD  5 
prod1 classA CCD_TS 7/4/2017 
prod1 classA MSD  8 
prod1 classA MSD_TS 7/9/2017 

查询

select u.product, u.class,u.type, u.value 
from source_table s 
unpivot 
(
    value 
    for type in (AFD, AFD_TS, CCD, CCD_TS, MSD, MSD_TS) 
) u; 

原始输入

product class AFD AFD_TS  CCD CCD_TS  MSD MSD_TS 
-------------------------------------------------------------- 
prod1 classA 2 6/29/2017 5 7/4/2017 8 7/9/2017 
prod1 classB 3 6/30/2017 6 7/5/2017 9 7/10/2017 
prod1 classC 4 7/1/2017 7 7/6/2017 1 7/11/2017 
prod2 classA 12 7/2/2017 15 7/7/2017 18 7/12/2017 
prod2 classB 13 7/3/2017 16 7/8/2017 19 7/13/2017 
prod2 classC 14 7/4/2017 17 7/9/2017 11 7/14/2017 

预计输出

product class type Value TS 
----------------------------------- 
prod1 classA AFD 2 6/29/2017 
prod1 classA CCD 5 7/4/2017 
prod1 classA MSD 8 7/9/2017 
prod1 classB AFD 3 6/30/2017 
prod1 classB CCD 6 7/5/2017 
prod1 classB MSD 9 7/10/2017 
prod1 classC AFD 4 7/1/2017 
prod1 classC CCD 7 7/6/2017 
prod1 classC MSD 1 7/11/2017 
prod2 classA AFD 12 7/2/2017 
prod2 classA CCD 15 7/7/2017 
prod2 classA MSD 18 7/12/2017 
prod2 classB AFD 13 7/3/2017 
prod2 classB CCD 16 7/8/2017 
prod2 classB MSD 19 7/13/2017 
prod2 classC AFD 14 7/4/2017 
prod2 classC CCD 17 7/9/2017 
prod2 classC MSD 11 7/14/2017 

PS - 之前反对投票请说明反对投票的原因。对你来说,这个问题可能很愚蠢,但我真的在这个需求上试了很多。

Query for creating test data. 

create table source_table(product varchar(20), class varchar(20), AFD varchar(20), AFD_TS varchar(20), CCD varchar(20), CCD_TS varchar(20), MSD varchar(20), MSD_TS varchar(20)) 

insert into source_table 
values('prod1', 'classA', 2, '6/29/2017', 5, '7/4/2017' , 8 , '7/9/2017'), 
('prod1', 'classB', 3, '6/30/2017', 6, '7/5/2017', 9, '7/10/2017'), 
('prod1', 'classC', 4, '7/1/2017', 7, '7/6/2017', 1, '7/11/2017'), 
('prod2', 'classA', 12, '7/2/2017', 15, '7/7/2017', 18, '7/12/2017'), 
('prod2', 'classB', 13, '7/3/2017', 16, '7/8/2017', 19, '7/13/2017'), 
('prod2', 'classC', 14, '7/4/2017', 17, '7/9/2017', 11, '7/14/2017') 
+3

原始输出数据是混淆了..你是怎么得到原来的输出?什么是第一个结果集。更好地添加只是样本数据和预期的输出一起你已经尝试过的查询 –

+0

@Prdp更新与查询 – Gokul

+0

仍然不清楚最后的架构设置给出..但无论如何,我认为你需要枢轴不unpivot ..在这里检查我创建了演示http://rextester.com/QIEDW84523 –

回答

1

或许,这可以帮助

Select product 
     ,class 
     ,B.* 
From source_table A 
Cross Apply (values ('AFD',AFD,AFD_TS) 
        ,('CCD',CCD,CCD_TS) 
        ,('MSD',MSD,MSD_TS) 
      ) B (type,value,ts) 

返回

enter image description here

+0

谢谢。如果你在我的组织,我会给你一杯啤酒。 :) – Gokul

+0

@Gokul感谢咧嘴:) –

1

您需要Pivot的数据不是UnPivot。下面是一个使用到做这件事有条件总结

select product,class, 
     max(case when type not like '%/_TS' escape '/' then value end) as Value, 
     max(case when type like '%/_TS' escape '/' then value end) as TS 
from temp 
group by product,class,left(type,3)