2016-06-24 25 views
0

爲什麼heck不是這個工作?似乎遵循我在這裏找到的一切。我收到錯誤: 列'#TempTable.clientId'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。使用STUFF的問題

如果我將tt.clientId添加到組中,那麼它不會執行這些操作,並將它們全部合併爲一行,它們會作爲單獨的行出現。我有打字錯誤嗎?

SELECT tt.Station, STUFF((SELECT ', ' + c.client_code 
    FROM client c 
    WHERE tt.clientId = c.ID 
    FOR XML PATH('')),1,1,'') [Values]    
FROM #TempTable tt 
GROUP BY tt.Station 

回答

1

SELECT ... FOR XML PATH應該是GROUP BY列[s] tt.station在您的情況下的功能。 類似的東西

SELECT tt.Station, STUFF((SELECT ', ' + c.client_code 
    FROM client c 
    JOIN #TempTable tt2 
     ON tt2.clientId = c.ID 
     AND tt2.Station = tt.Station 
    FOR XML PATH('')),1,1,'') [Values]    
FROM 
GROUP BY tt.Station 
+0

呃,這讓我瘋狂。現在更有意義,謝謝! – Relevant

1

你,因爲你是用它來這裏的子查詢關聯到tt.ClientId添加到GROUP BY:WHERE tt.clientId = c.ID

否則,SQL Server如何知道哪個客戶端ID用於每個站?

如果您不想通過ClientId進行分組,那麼您必須通過tt.Station關聯。

1

有幾個選擇這裏,但這裏有一些事情要考慮:

  1. 確定你希望你的最左邊的項目是什麼 - 在這種情況下,看起來應該是station。如果是這樣的話,接近它的一種方法是首先獲得不同的電臺。這可以通過使用一個或一個獨立的組來完成。
  2. 確定要爲其生成列表的項目的級別 - 在本例中爲client_code。因此,你想讓你內在的選擇在那個級別。一種方法是在嘗試使用xml之前解析不同的客戶端代碼集。

一個批評 - 提供一組簡單的數據總是好的。使答案更容易,更快捷。

再次,這裏有替代方案,但這裏有一個可能的解決方案。

測試數據

select top (100) 
    client_id = abs(checksum(newid())) % 100, 
    client_code = char(abs(checksum(newid())) % 10 + 65) 
into #client 
from sys.all_columns a 
cross join sys.all_columns b; 

select top (100) 
    station = abs(checksum(newid())) % 10, 
    client_id = abs(checksum(newid())) % 50 -- just a subset 
into #temp 
from sys.all_columns a 
cross join sys.all_columns b; 

查詢

select station, client_codes = stuff((
    select ', ' + cc.client_code 
    from (
     select distinct c.client_code -- distinct client codes 
     from #temp t 
     join #client c 
      on t.client_id = c.client_id 
     where t.station = s.station) cc 
    order by client_code 
    for xml path('')), 1, 2, '') 
from (
    select distinct station 
    from #temp) s; -- distinct stations 

結果

station  client_codes 
----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
0   B, C, D, E, G, J 
1   A, B, D, G, H, J 
2   A, C, E, F, G, H, J 
3   B, C, H, J 
4   A, B, C, D, F, H, J 
5   H, J 
6   D, E, F, G, I 
7   A, C, D, F, G, H, J 
8   A, E, G 
9   C, E, F, G, I 

希望這有助於。