2012-09-28 49 views
18

我正在研究一個將從表中收集數據並顯示報表數據的查詢。將多行合併到一列中而不重複

的數據是這樣的:

Player Score 
001  10 
001  20 
002  20 
002  20 
001  10 
002  10 
003  20 
002  20 
001  10 

我希望它這樣

Player Score 
001 10,20 
002 10,20 
003 20 

顯示它,但我得到的是這樣的

在得分列所有數據的組合列表
Player Score 
001 10,20,10,10 
002 20,20,10,20 
003 20 

有沒有人有一個想法如何使這項工作?

+0

您是否嘗試過使用'DISTINCT'? – Kermit

+3

你爲什麼想要?這是一個SQL反模式。 – MatBailie

+0

可以反覆出現的'CTE'回答這個?反覆將每個分數連接到一個字符串? – whytheq

回答

33

對於SQL Server,你可以使用:

select player, 
    stuff((SELECT distinct ', ' + cast(score as varchar(10)) 
      FROM yourtable t2 
      where t2.player = t1.player 
      FOR XML PATH('')),1,1,'') 
from yourtable t1 
group by player 
+2

我不知道這是如何工作,但它的工作。驚人!謝謝。 – Lukas

+0

如何使用回車換行來替換逗號?我嘗試用CHAR(13)+(Char10)替換',',但它一直用「#x0D」取代它們。 – Osprey

+1

@Osprey請發佈一個新的問題與您的查詢以及您正在嘗試做什麼。 :) – Taryn

1

有點晚了,並稍微偏離主題爲另一個RDBMS,但我發現這個線索尋找一個解決方案,在Postgres的這個問題。我找到了一個,所以如果有其他人需要在Pg中解決這個問題:

SELECT string_agg(DISTINCT <column>,'delimiter') FROM <table> GROUP BY <column2> 
+0

string_agg是一個Oracle函數;不存在於mssql中。 – MarwaAhmad

+0

@MarwaAhmad'STRING_AGG'不是Oracle函數。它是[PostgreSQL之一](https://www.postgresql.org/docs/current/static/functions-aggregate.html)(現在是SQL Server 2017以來的SQL Server)。 – jpmc26