2009-06-16 53 views
2

我不得不以某種方式在連接某個列的同時分組行,我不知道如何去做這件事。以下是我需要的一個例子。將某一列與一個分隔列連接在一起組合起來的行

CREATE TABLE People(
PersonName varchar(100), 
PersonAge int 
) 

INSERT INTO People 
SELECT 'bill', 21 

INSERT INTO People 
SELECT 'harry', 21 

INSERT INTO People 
SELECT 'wesley', 21 

INSERT INTO People 
SELECT 'tom', 42 

INSERT INTO People 
SELECT 'paul', 42 

INSERT INTO People 
SELECT 'phil', 53 

從該表中一個正常的選擇將產生如下:

bill 21 
harry 21 
wesley 21 
tom  42 
paul 42 
phil 53 

我需要的是以下幾點:

bill, harry, wesley 21 
tom,paul    42 
phil     53 

我不知道這是可能的,但它會如果有人知道如何去做,那真的很有幫助。提前致謝。

回答

1

這是一個難題。對於一個在它的深度處理看到這個優秀的帖子:

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

對於一個簡單的解決方案,我用了一個光標,它的工作:

create procedure 
doIt 
as 

create table #out 
(people varchar(2000) null, -- assumed max length of concatenated string 
age int) 

insert into #out(age) 
select distinct personAge from people 

declare @str varchar(2000) 
select @str = isnull(@str,'') + personname +',' from people 

declare @age int 
declare cur cursor for select age from #out 

open cur 
fetch next from cur into @age 

while @@fetch_status =0 
begin 
    set @str = '' 
    select @str = isnull(@str,'') + personname +',' from people where personage = @age 
    update #out set people = left(@str,len(@str)-1) where [email protected] 
    fetch next from cur into @age 
end 

close cur 
deallocate cur 

select * from #out 
+0

好了,我不喜歡的光標。但你給的鏈接真的很酷。 +1 :) – Kirtan 2009-06-16 10:11:22

0

下面是使用沒有光標的方式tekBlues放在他的帖子中的鏈接:

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

這是Sql Server中的一個難題。例如,您可以創建一個custom string concatenation aggregate。但是這需要你將一個.NET程序集加載到你的Sql Server中;並不是所有的DBA都會同意這一點。

在客戶端,這非常簡單。你爲什麼不考慮解決這個客戶端?

2

SELECT p1.personage, (SELECT PERSONNAME + '' FROM人P2 WHERE p2.personage = p1.personage ORDER BY PERSONNAME FOR XML PATH( ''))AS結果 從人P1 GROUP BY人物;

0

如果你使用MySQL,它是那樣簡單,因爲它可以

SELECT GROUP_CONCAT(PersonName SEPARATOR ', ') as name, PersonAge 
FROM People GROUP BY PersonAge 

還有訂單的不同的選項:)