2016-09-23 100 views
1

我有一个名为T1,T2,T3,...,T10 10页的表和每个商店列名为ID,C1,C2,C3 ...,C100。在多个表中添加列与相同的列名

我想创建存储对应等等列即T1.C1 + T2.C1 + T3.C1,T1.C2 + T2.C2 + T3.C2和的总和汇总表。

如果只有几列我可以做的事情为:

select T1.C1 + T2.C1 + T3.C1 as C1, T1.C2 + T2.C2 + T3.C2 as C2 
from T1 
inner join T2 
on T1.ID = T2.ID 
inner join T3 
on T1.ID = T3.ID 

,但我有100列增加,我有大量的表。

+0

请标记相应的RDMS ... SQL Server,Oracle,...? –

回答

2

假设ID是每个表的主键:

select ID, sum(c1) as c1, sum(c2) as c2 --,... 
from(
    select ID, c1, c2 --,.. 
    from T1 
    union all 
    select ID, c1, c2 --,.. 
    from T2 
    -- union all .. 
) T 
group by ID 
+0

应该能够使用'选择*'如果列是相同的 – JamieD77

1

如果你不介意的动态

Declare @Cols varchar(max) = '>>>' 
;with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
     cte2(N) As (Select Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 a, cte1 b) A) --<< 100 Columns 
Select @Cols = Replace(@Cols+',C'+cast(N as varchar(5))+'=sum(C'+cast(N as varchar(5))+')','>>>,','') from cte2 

Declare @From varchar(max) = '>>>' 
;with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
     cte2(N) As (Select Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 a) A) --<< 10 Tables 
Select @From = Replace(@From+'Union All Select * from T'+cast(N as varchar(5))+' ','>>>Union All','') from cte2 

Declare @SQL varchar(max) ='Select ID,'[email protected]+' From ('[email protected]+') A Group By ID' 
Exec(@SQL) 
1

只是为了好玩,你可能要考虑以下几点。子查询将在EAV(元素属性值)结构中标准化您的数据

Declare @XML xml = (Select * From (Select * from T1 Union All Select * from T2 Union All Select * from T3 Union All Select * from T4 Union All Select * from T5 Union All Select * from T6 Union All Select * from T7 Union All Select * from T8 Union All Select * from T9 Union All Select * from T10) A for XML RAW) 
Select ID 
     ,Item 
     ,Value = Sum(Value) 
From (
     Select ID = r.value('@ID','int')       -- << Key ID (Case Sensitive)  
       ,Item = attr.value('local-name(.)','varchar(50)') 
       ,Value = attr.value('.','money')       -- << Set Appropriate Data Type 
     From @XML.nodes('/row') as A(r)       
     Cross Apply A.r.nodes('./@*[local-name(.)!="id"]') as B(attr) -- << Key ID (Case Sensitive)  
    ) A 
Group By ID,Item