2011-10-04 2 views
0

SSMS 2008을 사용 중이고 다른 필드의 그룹화를 기반으로 행 중 하나를 함께 연결하려고합니다. people_id와 address_desc라는 두 개의 열이 있습니다. 모양은 다음과 같습니다.TSQL에서 단일 열을 연결

address_desc       people_id 
----------       ------------ 
Murfreesboro, TN 37130    F15D1135-9947-4F66-B778-00E43EC44B9E 
11 Mohawk Rd., Burlington, MA 01803 C561918F-C2E9-4507-BD7C-00FB688D2D6E 
Unknown, UN 00000     C561918F-C2E9-4507-BD7C-00FB688D2D6E  Jacksonville, NC 28546     FC7C78CD-8AEA-4C8E-B93D-010BF8E4176D 
Memphis, TN 38133     8ED8C601-5D35-4EB7-9217-012905D6E9F1 
44 Maverick St., Fitchburg, MA  8ED8C601-5D35-4EB7-9217-012905D6E9F1 

이제 address_desc 필드/people_id를 연결합니다. 그래서 여기서 첫 번째 것은 address_desc에 "Murfreesboro, TN 37130"을 표시해야합니다. 그러나 두 번째 사람은 address_desc에 대해 "11 Mohawk Rd., Burlington, MA 01803; Unknown, UN 00000"이라는 두 줄 대신 한 줄만 사용해야합니다.

어떻게하면됩니까? 나는 CTE를 사용하여 시도, 그러나 이것은 나에게 모호성 오류를주고 있었다 :

SELECT a.address_desc, a.people_id 
FROM dbo.address_view a 
INNER JOIN (SELECT people_id 
FROM dbo.address_view 
GROUP BY people_id 
HAVING COUNT(*) > 1) t 
ON a.people_id = t.people_id 
order by a.people_id 

답변

2

당신은이 같은 FOR XML PATH('')를 사용할 수 있습니다 :

DECLARE @TestData TABLE 
(
    address_desc NVARCHAR(100) NOT NULL 
    ,people_id UNIQUEIDENTIFIER NOT NULL 
); 

INSERT @TestData 
SELECT 'Murfreesboro, TN 37130',    'F15D1135-9947-4F66-B778-00E43EC44B9E' 
UNION ALL 
SELECT '11 Mohawk Rd., Burlington, MA 01803', 'C561918F-C2E9-4507-BD7C-00FB688D2D6E' 
UNION ALL 
SELECT 'Unknown, UN 00000',     'C561918F-C2E9-4507-BD7C-00FB688D2D6E' 
UNION ALL 
SELECT 'Memphis, TN 38133',     '8ED8C601-5D35-4EB7-9217-012905D6E9F1' 
UNION ALL 
SELECT '44 Maverick St., Fitchburg, MA',  '8ED8C601-5D35-4EB7-9217-012905D6E9F1'; 

SELECT a.people_id, 
    (SELECT SUBSTRING(
     (SELECT ';'+b.address_desc 
     FROM @TestData b 
     WHERE a.people_id = b.people_id 
     FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
     ,2 
     ,4000) 
    ) GROUP_CONCATENATE 
FROM @TestData a 
GROUP BY a.people_id 

결과를

WITH CTE (people_id, address_list, address_desc, length ) 
      AS (SELECT people_id, CAST('' AS VARCHAR(8000)), CAST('' AS VARCHAR(8000)), 0 
       FROM dbo.address_view 
       GROUP BY people_id 
       UNION ALL 
       SELECT p.people_id, CAST(address_list + 
         CASE WHEN length = 0 THEN '' ELSE ', ' END + c.address_desc AS VARCHAR(8000)), 
         CAST(c.address_desc AS VARCHAR(8000)), length + 1 
       FROM CTE c 
       INNER JOIN dbo.address_view p 
        ON c.people_id = p.people_id 
       WHERE p.address_desc > c.address_desc) 
SELECT people_id, address_list 
     FROM (SELECT people_id, address_list, 
        RANK() OVER (PARTITION BY people_id ORDER BY length DESC) 
       FROM CTE) D (people_id, address_list, rank) 
    WHERE rank = 1 ; 

가 여기 내 초기 SQL 쿼리했다 :

people_id       GROUP_CONCATENATE 
------------------------------------ ------------------------------------------------------ 
F15D1135-9947-4F66-B778-00E43EC44B9E Murfreesboro, TN 37130 
C561918F-C2E9-4507-BD7C-00FB688D2D6E 11 Mohawk Rd., Burlington, MA 01803;Unknown, UN 00000 
8ED8C601-5D35-4EB7-9217-012905D6E9F1 Memphis, TN 38133;44 Maverick St., Fitchburg, MA 
+0

슈퍼! 정확히 내가 필요로하는 것. 감사! – salvationishere

관련 문제