2012-08-26 2 views
4

하나에 여러 행을 결합, 나는 [A], [B], [C], [정렬] 열이있는 테이블이 있고 그것은 4 개 기록이 있습니다는 SQL Server 2008의 SQL

1,  NULL, NULL 0 
NULL, 2,  NULL 1 
NULL, NULL, 3  2 
10,  NULL, NULL 3 

결과적으로 한 행을 얻는 방식으로 모든 행을 결합해야하며 각 열의 경우 정렬 열에 따라 정렬 된 첫 번째 (null이 아닌) 값을 얻습니다. 따라서 내 결과는 다음과 같아야합니다.

1,  2,  3 

누구든지이 방법을 제안 할 수 있습니까? 감사

+0

이 테이블이 실제로 행만의 이러한 작은 금액이 있습니까 방법은? 만약 그렇다면 3 개의'TOP' 쿼리와 같은 간단한 솔루션을 사용해도됩니다. –

+0

확실히 작은 양의 레코드가 있습니다. 10 이하일 가능성이 높습니다. 세 가지 TOP 쿼리가 의미하는 바를 보여 줄 수 있습니까? – BlueChameleon

답변

7

SELECT (SELECT TOP 1 [a] 
     FROM @T 
     WHERE [a] IS NOT NULL 
     ORDER BY [sort]) AS [a], 
     (SELECT TOP 1 [b] 
     FROM @T 
     WHERE [b] IS NOT NULL 
     ORDER BY [sort]) AS [b], 
     (SELECT TOP 1 [c] 
     FROM @T 
     WHERE [c] IS NOT NULL 
     ORDER BY [sort]) AS [c] 

또는 또 다른

;WITH R 
    AS (SELECT [a], 
       [b], 
       [c], 
       [sort] 
     FROM @T 
     WHERE [sort] = 0 
     UNION ALL 
     SELECT Isnull(R.[a], T.[a]), 
       Isnull(R.[b], T.[b]), 
       Isnull(R.[c], T.[c]), 
       T.[sort] 
     FROM @T T 
       JOIN R 
        ON T.sort = R.sort + 1 
        AND (R.[a] IS NULL 
          OR R.[b] IS NULL 
          OR R.[c] IS NULL)) 
SELECT TOP 1 [a], 
      [b], 
      [c] 
FROM R 
ORDER BY [sort] DESC 
+0

+1 - 3 개의 하위 쿼리로 시작했지만 내 마음이 바뀌었지만 요청한 내용과 솔루션이 더 비슷합니다. –

+0

매력처럼 작동합니다. 감사합니다 – BlueChameleon

+3

+1. 여기에 바이올린 : http://sqlfiddle.com/#!3/fd607/1/0 –