Sql server SQL Server高级非规范化

Sql server SQL Server高级非规范化,sql-server,tsql,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 pr

我必须使用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')

您需要
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)
    • 也许这会有所帮助

      示例

      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)
      
      返回


      原始输出数据令人困惑。。你是怎么得到原始输出的?第一个结果集是什么。最好只添加示例数据和预期输出,以及您尝试过的查询far@Prdp使用queryStill更新我不清楚给出的最后一个架构设置。。但无论如何,我认为你需要的是支点,而不是取消支点。。检查这里我已经创建了demo@Prdp谢谢。这是我正在寻找的结果。但我想用pivot/unpivot函数来实现,因为我认为按查询分组需要花费大量时间来处理。我的源数据有1000多万条记录。请建议我的假设是否正确。技术
      条件聚合/交叉表
      将比
      Pivot
      操作员快一点谢谢。如果你在我的组织里,我会给你一杯啤酒@戈库尔:谢谢你的笑容:)