在一个表中显示多个表中的数据

时间:2018-07-15 06:32:35

标签: sql sql-server sql-server-2012

我有桌子

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

现在,我想根据月份来区分数据。我的结果集应该像这样:

enter image description here

如果有更多或更少的月份,列应自动增加或减少。

Code link

谢谢

1 个答案:

答案 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和子查询的更多信息。在极少数情况下,临时查询可以提高性能。在大多数情况下,它们通过引入不必要的读写来损害性能,并阻止优化器找到最有效的查询计划。