我有桌子
CREATE TABLE #TmpA
(
Type1 Varchar(10),
Col1 VARCHAR(10),
Request INT,
Due INT,
Month INT
);
CREATE TABLE #TmpB
(
Type1 Varchar(10),
Col1 VARCHAR(10),
Request INT,
Due INT,
Month INT
);
CREATE TABLE #TmpC
(
Type1 Varchar(10),
Col1 VARCHAR(10),
Request INT,
Due INT,
Month INT
);
CREATE TABLE #TmpD
(
Type1 Varchar(10),
Col1 VARCHAR(10),
Request INT,
Due INT,
Month INT
);
一个表代表用户需要选择的一个月数据。用户可以选择1个月,也可以选择全部12个月。这里以4个月的数据为例。
我将来自不同表的数据组合到一个表中。代码如下:-
select *
into #tmpCombine
from
(select * from #TmpA union all
select * from #tmpB union all
select * from #tmpc union all
select * from #tmpd) t
select *
from #tmpCombine
现在,我想根据月份来区分数据。我的结果集应该像这样:
如果有更多或更少的月份,列应自动增加或减少。
谢谢
答案 0 :(得分:1)
您有一个真的错误的数据模型,正如Tim在评论中指出的那样。您应该将所有数据存储在一个表中。通常,使用多个表是一个非常糟糕的主意。
但是您有union all
在一起的想法。下一步是枢轴,您可以使用pivot
或条件聚合来完成:
select type1, col1,
max(case when month = 1 then request end) as request1,
max(case when month = 1 then due end) as due1,
max(case when month = 2 then request end) as request2,
max(case when month = 2 then due end) as due2,
max(case when month = 3 then request end) as request3,
max(case when month = 3 then due end) as due3,
max(case when month = 4 then request end) as request4,
max(case when month = 4 then due end) as due4
from (select * from #TmpA union all
select * from #tmpB union all
select * from #tmpc union all
select * from #tmpd
) t
group by type1, col1;
您的编码问题建议您在编写查询时过度使用临时表。如果是这样,则需要了解有关CTE和子查询的更多信息。在极少数情况下,临时查询可以提高性能。在大多数情况下,它们通过引入不必要的读写来损害性能,并阻止优化器找到最有效的查询计划。