2011-04-12 114 views
1
Select s.FirstName, glTitle.LookupItem Title 
    from ClientStaff cs 
    left outer join Staff s on s.Id = cs.StaffId 
    left outer join StaffTitle st on st.StaffId = s.Id 
    left outer join GeneralLookup glTitle on glTitle.Id = st.glTitleId 

它返回這些行:如何逗號分隔的多個行

enter image description here

正如你可以看到,第一列所有相同的行,因爲一個員工可以有多個頭銜。

如何將每個員工的所有職位合併爲逗號分隔值,以便每個員工只有一行?

+0

正在使用的是何種數據庫? – grantk 2011-04-12 12:33:28

+0

SQL SERVER 2008 – asma 2011-04-12 12:37:49

+0

看看這個答案http://stackoverflow.com/questions/5631899/t-sql-how-to-get-the-corresponding-comma-separated-text-for-a-string-of -comma-S/5633449#5633449。 cte部分將逗號分隔的字符串拆分爲行,並且使用cte的查詢將它們再次組合。 – 2011-04-12 13:06:41

回答

3

這爲我工作:

;with mycte as 
    (select s.FirstName, glTitle.LookupItem Title 
    from ClientStaff cs 
    left outer join Staff s on s.Id = cs.StaffId 
    left outer join StaffTitle st on st.StaffId = s.Id 
    left outer join GeneralLookup glTitle on glTitle.Id = st.glTitleId 
    group by FirstName, glTitle.LookupItem) 

    SELECT Distinct FirstName, Titles = Replace(Replace((SELECT title AS [data()] FROM mycte a 

    WHERE a.FirstName = b.FirstName 

    ORDER BY a.title FOR XML PATH ),'</row>',', '),'<row>','') 

    FROM mycte b 
    ORDER BY FirstName 
0

這是在標準SQL中很難(或不可能)做的事情之一。許多供應商已經擴展了SQL來支持這樣的「彙總」;不幸的是,每個供應商的語法都不一樣。對不起,我目前沒有一個方便的例子。那麼你使用的是什麼DBMS?

+0

我正在使用SQL SERVER 2008 – asma 2011-04-12 12:37:01

0

試着這麼做:

select s.FirstName, GROUP_CONCAT(glTitle.LookupItem Title, ',') 
from ClientStaff cs 
left outer join Staff s on s.Id = cs.StaffId 
left outer join StaffTitle st on st.StaffId = s.Id 
left outer join GeneralLookup glTitle on glTitle.Id = st.glTitleId 
GROUP BY s.FirstName 

真的不能測試,所以它的難度,跟蹤和錯誤通常工作最終。我建議由一個唯一的ID分組。

我希望這有助於...

+1

我希望SQL Server具有GROUP_CONCAT。那mysql功能太棒了! – JStead 2011-04-12 13:03:34

+0

GROUP_CONCAT不能在SQL SERVER中工作... – asma 2011-04-13 06:38:03

1

我通常創建SQL函數,並從我的查詢調用它們。您可以使用多種方法創建逗號分隔的值列表,請參閱http://blog.sqlauthority.com/2008/06/04/sql-server-create-a-comma-delimited-list-using-select-clause-from-table-column/,Can I Comma Delimit Multiple Rows Into One Column?

在這種情況下,如果你創建了一個函數,你可以從你的SQL查詢中調用它。例如:

select s.FirstName, dbo.GetAllJobTitlesForStaff(s.Id) AS AllJobTitles 
from ClientStaff cs 
left outer join Staff s on s.Id = cs.StaffId 
+0

第一個是一個不錯的鏈接!但它不能返回2列。最好爲1列 – asma 2011-04-14 13:41:43

0

您可以使用此查詢。對於這種模式下的查詢,我有通用模板。你可能需要調試,因爲我沒有你的表結構。它聚結的標題成一個列表

DECLARE @List varchar(2000), @otherList varchar(2000),@FirstName varchar(2000),@id varchar(2000) 
declare @temp table(
    firstName varchar(128), 
    title varchar(4000) 
) 

DECLARE TitleList CURSOR FAST_FORWARD FOR 
select s.FirstName, s.Id 
from ClientStaff cs 
left outer join Staff s on s.Id = cs.StaffId 
OPEN TitleList 
FETCH NEXT FROM TitleList INTO @FirstName,@id 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    select @List = COALESCE(@List + ',', '') + Cast(glTitle.LookupItem As varchar(400)) 
    from StaffTitle st 
    left outer join GeneralLookup glTitle on glTitle.Id = st.glTitleId 
    where st.StaffId = id 

    insert into @temp 
    select @FirstName,@List 
    set @List = null; 
FETCH NEXT FROM TitleList INTO @FirstName,@id 
END 
CLOSE TitleList 
DEALLOCATE TitleList 

select * from @temp 
+0

您的查詢不能正常工作:( 它返回2,2,每個名字的行和標題對所有行都是相同的 – asma 2011-04-13 06:43:00

+0

這些表之間的關係是什麼,即1-M,1-1 ,0-M – JStead 2011-04-13 12:02:25

0
select 
    s.FirstName, 
    stuff((select ', '+glTitle.LookupItem 
     from StaffTitle as st 
      inner join GeneralLookup as glTitle 
      on glTitle.Id = st.glTitleId 
     where st.StaffId = s.Id 
     for xml path(''), type).value('text()[1]', 'nvarchar(max)'), 1, 2, '') as Title 
from Staff as s 
+0

它正在重複記錄,工作得很好,但行重複,任何解決方案? – asma 2011-04-14 10:27:33

+0

@asma - 嘗試使用'ClientStaff'去除連接,讓我知道它是否有效或者ClientStaff表是否需要如果是,你可以用另一種方式添加 – 2011-04-14 11:03:54

+0

ClientStaff是必要的....... – asma 2011-04-14 12:31:58