SQL Server 2012中如何合并两个临时表的透视查询结果?
解决SQL Server 2012中两个透视查询合并的问题
你的问题出在UNION ALL的用法和透视查询的结构上——不能在UNION的每个分支里使用INTO创建临时表,而且直接把PIVOT跟在筛选语句后的语法也不符合SQL Server的要求。下面给你两种可行的解决方案,根据你的需求选择:
方案一:先合并数据集再透视(推荐,更高效)
先把两个筛选条件下的数据集合并,再一次性执行透视操作,这样只需要做一次透视,性能更好,也更简洁:
USE MyDatabase; WITH CombinedData AS ( -- 第一个查询的原始数据 SELECT [Col A], [Col B], [Col C] FROM MyList WHERE [Date] >= '2018-01-01' UNION ALL -- 第二个查询的原始数据 SELECT [Col A], [Col B], [Col C] FROM MyList WHERE [StayDate] >= '2018-01-01' AND [DateCreated] <= '2018-01-27' ) SELECT * FROM CombinedData PIVOT( SUM([Col B]) FOR [Col A] IN ([Jan], [Feb], [Mar], [Apr], [May], [Jun], [Jul], [Aug], [Sep], [Oct], [Nov], [Dec]) ) AS PVTTable;
说明:
- 用CTE(
WITH子句)把两个筛选后的数据集合并成一个逻辑表CombinedData - 对这个合并后的表执行透视,直接得到你需要的统一结果,不需要临时表
方案二:分别透视后再合并(保留来源标识)
如果你需要区分结果里的每行数据来自哪个原始查询,可以给每个透视结果添加一个标识列,再用UNION ALL合并:
USE MyDatabase; -- 第一个透视结果,添加来源标识 SELECT 'Query1' AS SourceQuery, * FROM ( SELECT [Col A], [Col B], [Col C] FROM MyList WHERE [Date] >= '2018-01-01' ) AS Query1Data PIVOT( SUM([Col B]) FOR [Col A] IN ([Jan], [Feb], [Mar], [Apr], [May], [Jun], [Jul], [Aug], [Sep], [Oct], [Nov], [Dec]) ) AS PVT1 UNION ALL -- 第二个透视结果,添加来源标识 SELECT 'Query2' AS SourceQuery, * FROM ( SELECT [Col A], [Col B], [Col C] FROM MyList WHERE [StayDate] >= '2018-01-01' AND [DateCreated] <= '2018-01-27' ) AS Query2Data PIVOT( SUM([Col B]) FOR [Col A] IN ([Jan], [Feb], [Mar], [Apr], [May], [Jun], [Jul], [Aug], [Sep], [Oct], [Nov], [Dec]) ) AS PVT2;
说明:
- 每个透视操作都先通过子查询获取原始筛选数据,再执行透视
- 添加
SourceQuery列后,你能清楚看到每行结果来自第一个还是第二个查询 - 确保两个透视后的列结构完全一致(包括顺序和数据类型),
UNION ALL才能正常工作
为什么你的原写法无效?
INTO不能在UNION分支中使用:INTO是用来创建新表的,每个UNION语句只能有一个INTO(如果要用的话),但这里你根本不需要临时表,直接用CTE或子查询更合适。- 透视查询的语法错误:SQL Server要求透视操作的源数据必须是一个子查询、CTE或表,不能直接跟在
SELECT ... WHERE后面。
内容的提问来源于stack exchange,提问作者user3115933
相关产品推荐
相关产品推荐

