SQL Server高级非规范化

时间:2017-06-29 14:53:08

标签: sql-server tsql

我必须使用T-SQL对数据进行反规范化,我尝试使用unpivot函数。但是它返回了这样的输出。我需要一个不同的输出请建议步骤。谢谢。

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')

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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