2011-10-04 53 views
0

串联单列我使用2008年SSMS并试图串连在一起,根据不同领域的分组行之一。我有两列,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”。但第二个人应该只有一行,而不是两个,其中地址_desc为“Mohawk Rd。,Burlington,MA 01803; Unknown,UN 00000”。

我该怎么做?我试着用CTE,但是这是给我多义性错误:

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查询:

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 

结果:

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