Sql server SQL Server高级非规范化
我必须使用T-SQL反规范化数据,我尝试使用unpivot函数。但它返回的输出是这样的。我需要不同的输出,请建议步骤。多谢各位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
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
操作员快一点谢谢。如果你在我的组织里,我会给你一杯啤酒@戈库尔:谢谢你的笑容:)