2013-07-05 3 views
0

첫 번째 세 레코드의 값을 네 번째 레코드로 "평평하게"가장 좋은 방법을 찾고 있습니다 (그림 참조). 값은 텍스트가되며 각 레코드는 값 열 중 하나에 하나의 값만 갖습니다. 또한 하나의 계좌 번호에는 예와 같이 하나 또는 여러 개의 레코드가있을 수 있습니다. 감사.레코드를 하나로 병합

참고 : 내 질문에 관련된 몇 가지 다른 주제를 봐 왔지만, 그들은 나의으로 매우 동일하지 않습니다 :

Sql Merging multiple records into one record

Merge multiple records into one row in a table

AcctNum|Val1|Val2|Val3| 
1  |x | | | 
1  | |y | | 
1  | | |z | 
1  |x |y |z | 
+0

나는 당신이이 [Sql 여러 레코드를 하나의 레코드로 병합]에서 무엇을 요구하는지에 차이가 없음을 말해야합니다. (http://stackoverflow.com/questions/16668685/sql-merging-multiple-records- 1 기록으로). 대답은 너무 좋아 보인다. –

+0

이 공백 값은 NULL 값입니까, 빈 문자열입니까? 그리고 단일 AcctNum이 Val1 필드에 값이있는 둘 이상의 레코드를 가질 수 있습니까? – MatBailie

+0

@LennartRegebro - Err, 아니요, 이것의 복제본이 아닙니다 ... – MatBailie

답변

1
SELECT 
    AcctNum, 
    MAX(Val1) AS Val1, 
    MAX(Val2) AS Val2, 
    MAX(Val3) AS Val3 
FROM 
    yourTable 
GROUP BY 
    AcctNum 

NULL 절대로 모든 값 집합의 MAX 또는 MIN이 아닙니다. MAX()MIN() 행이없는 경우에만 NULL을 반환하거나 모든 값NULL이다.

즉, MAX() 또는 MIN()NULL을 모두 제거하고 사용 가능한 값 하나만 반환합니다.

0

SQL을 수행하는 방법은 집계 함수와 GROUP BY를 사용하는 것입니다.

SELECT t.AcctNum 
    , MAX(t.Val1) AS Val1 
    , MAX(t.Val2) AS Val2 
    , MAX(t.Val3) AS Val3 
    FROM mytab t 
WHERE t.AcctNum = 1 
GROUP BY t.AcctNum 

당신은 세 개의 행을 반환하려면, 플러스이 네 번째 행, 당신은 UNION ALL 연산자를 사용할 수있는 경우 : 둘 이상의 ACCTNUM를 반환하는 경우

SELECT t.AcctNum 
    , t.Val1 
    , t.Val2 
    , t.Val3 
    FROM mytab t 
WHERE t.AcctNum = 1 
UNION ALL 
SELECT t.AcctNum 
    , MAX(t.Val1) AS Val1 
    , MAX(t.Val2) AS Val2 
    , MAX(t.Val3) AS Val3 
    FROM mytab t 
WHERE t.AcctNum = 1 
GROUP BY t.AcctNum 

을, 그리고 당신이 행을 원하는 특정 시퀀스로 반환되었으므로 까다로울 수 있습니다.

0

가장 간단한 방법은 집계입니다 :

select AcctNum, max(val1) as val1, max(val2) as val2, max(val3) as val3 
from Yourtable t 
group by AcctNum; 

내가 두 번째 줄에 세미콜론을 가정 오타, 당신은 정말 존재하는 경우이를 제거하려고하지 않습니다.

관련 문제