2017-04-30 2 views
1

3 개의 테이블이 있습니다. 두 번째 테이블과 세 번째 테이블의 해당 값을 아래 그림의 첫 번째 테이블에 추가하고 싶습니다. 각 테이블에는 일치시킬 수있는 ID가 있습니다 (그림의 ... 필드). 첫 번째 테이블에는 ID 열과 8 개의 다른 열이있는 1531 개의 행이 있습니다. 그림의 맨 위 테이블 인이 테이블은 거의 0으로 가득합니다.SQL Server : 큰 테이블의 크기를 잃지 않고 큰 테이블의 값에 작은 테이블의 값을 추가 하시겠습니까?

여러 가지 방법으로 테이블을 조인하려했지만 각 테이블의 행 수가 다르므로 고유 번호가 다릅니다. 상단 테이블에는 모든 ID가 있습니다.

두 번째 테이블을 첫 번째 테이블에 추가 한 다음 세 번째 테이블을 그 결과에 추가하는 편리한 방법이 있습니까? Suzena을 제안 왼쪽의

enter image description here

결과 가입 : 왜 숫자가 함께 합산되지 않습니다?

enter image description here

답변

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;  

방법 2 조인 : 노동 조합

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 

당신이 어떤 다른 기준이 있으면 알려주세요.

방법 3 : 필드의 다른 번호를 가지고 있으므로 NULL 또는

SELECT 
    [MID], 
    SUM([KEVAT 201501-04]) AS  'KEVAT 201501-04', 
    SUM([KESA 201504-06]) AS  'KESA 201504-06', 
    SUM([SYKSY 201507-09]) AS  'SYKSY 201507-09', 
    SUM([TALVI 201510-12]) AS  'TALVI 201510-12', 
    SUM([KEVAT 201601-04]) AS  'KEVAT 201601-04', 
    SUM([KESA 201604-06]) AS  'KESA 201604-06', 
    SUM([SYKSY 201607-09]) AS  'SYKSY 201607-09', 
    SUM([TALVI 201610-12]) AS  'TALVI 201610-12' 
FROM 
(

SELECT * FROM TABLE1 

UNION ALL 

SELECT [MID] 
     ,0 AS 'KEVAT 201501-04' 
     ,0 AS 'KESA 201504-06' 
     ,0 AS 'SYKSY 201507-09' 
     ,0 AS 'TALVI 201510-12' 
     ,[KEVAT 201601-04] 
     ,[KESA 201604-06] 
     ,[SYKSY 201607-09] 
     ,[TALVI 201610-12] 
FROM TABLE2 

UNION ALL 

SELECT [MID] 
     ,[KEVAT 201501-04] 
     ,[KESA 201504-06] 
     ,[SYKSY 201507-09] 
     ,[TALVI 201510-12] 
     ,0 AS 'KEVAT 201601-04' 
     ,0 AS 'KESA 201604-06' 
     ,0 AS 'SYKSY 201607-09' 
     ,0 AS 'TALVI 201610-12' 
    FROM TABLE3 
) a 
GROUP BY [MID] 
+0

사용해보십시오 사용 결과 [여기] (https://i.stack.imgur.com/EYSek.png)를 볼 수 있습니다. 테이블은 나란히 배치됩니다. 나는 그들이 일치 할 때 대응하는 숫자가 함께 요약 될 것을 원합니다. 이제 그들은 모든 테이블을 나란히 놓습니다. – hhh

+0

나는 합계에 대한 쿼리를 편집했으며 대체 솔루션을 언급했습니다. 그 내용을 확인하고 다른 것이 필요한지 알려주십시오. –

+0

두 번째 방법을 시도했는데'UNION, INTERSECT 또는 EXCEPT 연산자를 사용하여 결합 된 모든 쿼리는 대상 목록에 동일한 수의 표현식을 가져야합니다. '오류가 발생했습니다. 이것은 테이블의 열 수가 서로 다르기 때문에 분명히 나타납니다. 첫 번째 테이블에는 9 개의 열이 있고 두 번째 테이블과 세 번째 테이블에는 5 개의 열이 있음을 알 수 있습니다. 각 테이블에는 키로 작동하는 동일한 ID 열이 있지만 각 테이블의 행 수는 다릅니다. 첫 번째 테이블에는 가능한 모든 ID가 있습니다. – hhh

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의 열 이름이 일치해야합니다. 별칭을 사용하십시오.

0

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