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],现在将查看它,谢谢!对合并难题有什么建议吗?