Sql server PIVOT和MERGE的性能-有更好的方法吗?
抱歉,这可能有点超出了这里社区的范围,但我想听听第二种意见 我有一张结构如下的桌子Sql server PIVOT和MERGE的性能-有更好的方法吗?,sql-server,merge,pivot,Sql Server,Merge,Pivot,抱歉,这可能有点超出了这里社区的范围,但我想听听第二种意见 我有一张结构如下的桌子 Table_1 TYPE ITEM DATE QTYA QTYB QTYC X AAA 17/08/2015 100 200 300 X AAA 18/08/2015 100 170 240 Y BBB 17/08/2015 100 240 100 我需要
Table_1
TYPE ITEM DATE QTYA QTYB QTYC
X AAA 17/08/2015 100 200 300
X AAA 18/08/2015 100 170 240
Y BBB 17/08/2015 100 240 100
我需要将此表用作合并的源,但目标表的格式完全不同
Table_2
ITEM QTYA_1 QTYA_2......QTYA_31 QTYB_1 QTYB_2 QTYB_3......QTYB_31 QTYC_1 QTYC_2....QTYC_31
(数字后缀基本上为每月的第几天)
我可以混合使用UNION ALL和PIVOT将表1转换为表2的格式,但性能不是很好——特别是因为我必须先将信息保存在临时表中,然后再将其合并到中(表_1中的每个“类型”都有不同的开始日期,我不能从不同的日期开始覆盖表_2中以前的值-基本上我必须用不同的项目类型和不同的开始日期合并表3或4次)
这是我到目前为止得到的
SELECT TOP 0 * INTO #TEMP_PIVOT_TABLE
INSERT INTO #TEMP_PIVOT_TABLE SELECT * FROM
(SELECT ITEM, 'QTYA_' + CONVERT(DATETIMEFROMPARTS(day,DATE) AS VARCHAR) as 'Quantity Type', QTY_A FROM TABLE_1
UNION_ALL
SELECT ITEM, 'QTYB_' + CONVERT(DATETIMEFROMPARTS(day,DATE) AS VARCHAR) as 'Quantity Type', QTY_B FROM TABLE_1
UNION_ALL
SELECT ITEM, 'QTYC_' + CONVERT(DATETIMEFROMPARTS(day,DATE) AS VARCHAR) as 'Quantity Type', QTY_C FROM TABLE_1
) A
PIVOT
(SUM(QUANTITY) FOR QUANTITY_TYPE IN ([QTYA_1], [QTYA_2],.....[QTYA_31],[QTYB_1].....[QTYC_31],[QTYC_1].....[QTYC_31])) AS B
----For each different date per item_type, construct a string only selecting those days in the month.
Then merge the results from #TEMP_PIVOT_TABLE into TABLE_2 for each Item TYPE` with dynamic SQL
1) 有没有更好的方法来执行PIVOT命令?UNIONALL命令的性能并不令人鼓舞——特别是因为我从中读取的表包含大量数据。为了简洁起见,我在这里也进行了简化——实际的表需要映射5列左右,每个列有31天
2) 有更好的合并方法吗?我不喜欢使用循环+动态SQL基本上重复读取相同的数据集,只是为了在不同的列上合并,但我看不到不同的方法。这样一来,动态构建包含如此多列的MERGE命令将给将来的维护带来麻烦
有人知道我如何更有效地执行此操作吗?您可以用以下查询替换
union all
内部查询。此查询只需点击一次表,而不是点击每列的表
要取消抽取数据,请使用交叉应用
和表值构造函数
select ITEM,[Quantity Type],QTY
from yourtable
cross apply
(
values
('QTYA_' + CONVERT(DATEPART(day,DATE) AS VARCHAR),QTY_A),
('QTYB_' + CONVERT(DATEPART(day,DATE) AS VARCHAR),QTY_B),
('QTYC_' + CONVERT(DATEPART(day,DATE) AS VARCHAR),QTY_C),
)
CS ([Quantity Type],QTY)
以前从未使用过[CROSS APPLY],现在将查看它,谢谢!对合并难题有什么建议吗?