SQL Server:将小表的值添加到大表的值而不会丢失大表的维度?

时间:2017-04-30 20:45:27

标签: sql sql-server join sql-server-2014

我有3张桌子。我想将第二个表和第三个表中的相应值添加到下图中的第一个表中。每张表都有一个可以匹配的ID,图片中的...字段。第一个表有1531行,ID列和其他8列。这张桌子是图片中的顶级表格,几乎全是零。

我试图以不同的方式加入表,但问题是每个表都有不同的行数,因此不同的数字唯一ID。顶部表格包含所有ID。

是否有一些方便的方法将第二个表添加到第一个表,然后将第三个表添加到该结果中?

enter image description here

按建议Suzena建议的左连接结果:为什么这些数字不能一起汇总?

enter image description here

3 个答案:

答案 0 :(得分:2)

方法1:加入

body,div {
  font-family: 'Bungee Inline', cursive;
}

方法2:工会

select a.id,(a.col1 + b.col1+c.col1) as col1, (a.col2 + b.col2 + c.col2) as col2, (a.col3 + b.col3 + c.col3) as col3
from
table1 a
left join
table2 b
on a.id = b.id
left join
table3 c
on a.id = c.id;    

如果您有任何不同的标准,请告诉我。

方法3:拥有不同数量的字段,因此请使用select id,sum(col1) col1, sum(col2) col2, sum(col3) col3 from ( select id,col1,col2,col3 from table1 union all select id,col1,col2,col3 from table2 union all select id,col1,col2,col3 from table3 ) t group by id NULL

0

答案 1 :(得分:0)

如果我理解你的问题,你可以使用工会。类似的东西:

      insert into table1(col1,col2,col3,col4)  
(select col1,col2,col3,col4 from table2 union 
select col1,col2,col3,col4 from table3)

table2和table3的列名必须匹配。使用别名。

答案 2 :(得分:0)

尝试使用MERGE

--Get data from table 2 and merge into table 1

MERGE Table_1 AS TARGET
USING (SELECT [ID]
  ,[KEVAT 201501-04]
  ,[KESA 201504-06]
  ,[SYKSY 201507-09]
  ,[TALVI 201510-12] FROM Table_2) AS SOURCE
ON (TARGET.ID = SOURCE.ID)
WHEN MATCHED
THEN UPDATE SET
    TARGET.[KEVAT 201501-04] = SOURCE.[KEVAT 201501-04],
    TARGET.[KESA 201504-06] = SOURCE.[KESA 201504-06],
    TARGET.[SYKSY 201507-09] = SOURCE.[SYKSY 201507-09],
    TARGET.[TALVI 201510-12] = SOURCE.[TALVI 201510-12];
GO

--Get data from table 3 and merge into table 1
MERGE Table_1 AS TARGET
USING (SELECT [ID]
  ,[KEVAT 201601-01]
  ,[KESA 201604-06]
  ,[SYKSY 201607-09]
  ,[TALVI 201610-12] FROM Table_3) AS SOURCE
ON (TARGET.ID = SOURCE.ID)
WHEN MATCHED
THEN UPDATE SET
    TARGET.[KEVAT 201601-01] = SOURCE.[KEVAT 201601-01],
    TARGET.[KESA 201604-06] = SOURCE.[KESA 201604-06],
    TARGET.[SYKSY 201607-09] = SOURCE.[SYKSY 201607-09],
    TARGET.[TALVI 201610-12] = SOURCE.[TALVI 201610-12];
GO