2011-09-28 71 views
1

我有一些SQL是分組數據來總結它。
它基本上是一個位置,項目和數量的列表。SQL分組,結合2行到一個單元格

SELECT ItemCode, SUM(Qty) AS Qty 
FROM Putaway 
GROUP BY ItemCode 

這是工作正常,賦予結果的摘要。

ItemCode - Qty 
AAAA - 1 
BBBB - 2 
CCCC - 3 

但我被要求列出每個項目的位置。

所以基本上我想產生的結果是這樣的:

ItemCode - Qty - Locations 
AAAA  - 1 - A1 
BBBB  - 2 - B1, B2 
CCCC  - 3 - B5, B6, B7 

如果我做明顯的 - 而只是添加[位置]到SELECT和group by 那麼它給了我2排爲BBBB ,3爲CCCC等(正好如它應該,但不是我想如何)

因此,由於表中的每個項目有多個行 - 我如何總結它併合並行[位置]領域變成1場。

我希望有一個簡單的SQL解決方案,以避免我必須編寫某種網頁來做到這一點。

我希望這是有道理的。

+0

你在使用 – Matthew

+0

正如@MatthewPK說DB,什麼是您的數據庫?如果您使用的是SQL Server的最新實例,則可以'欺騙'並使用[PIVOT](http://msdn.microsoft.com/zh-cn/library/ms177410.aspx) – Widor

+0

@Widor:否。對於聚合可以使用連接'SELECT','+ Location FROM ... FOR XML PATH('')'。 –

回答

3

前提是你使用SQL Server 2005或更高版本,可以使用FOR XML做到這一點位對您:

create table Putaway (
    ItemCode varchar(4), 
    Qty   int, 
    Location varchar(3) 
) 

insert into Putaway 
values ('AAAA', 1, 'A1'), 
    ('BBBB', 1, 'B1'), 
    ('BBBB', 1, 'B2'), 
    ('CCCC', 1, 'B5'), 
    ('CCCC', 1, 'B6'), 
    ('CCCC', 1, 'B7') 

SELECT ItemCode, SUM(Qty) AS Qty, 
    ( SELECT x.Location + ', ' 
     FROM Putaway x 
     WHERE p.ItemCode = x.ItemCode 
     ORDER BY x.Location 
     FOR XML PATH ('') 
    ) as Locations 
FROM Putaway p 
GROUP BY ItemCode 

不幸的是,這導致在最後一個逗號,但你可以輕鬆修剪掉你的GUI或通過一個子選擇。

+1

只是爲了記錄,在SO上有一個previos類似的問題(和答案):http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005 – bfavaretto

+0

poo!被毆打到答案:) hehe – Christian

+0

我認爲這可能有很多類似的答案 - 這是我看到相當多的問題。 –

2
SELECT p1.ItemCode, SUM(p1.Qty) AS Qty, (SELECT p2.location + ',' as 'data()' from putaway as p2 WHERE p1.itemcode LIKE p2.itemcode FOR xml path('')) AS Locations 
FROM Putaway as p1 
GROUP BY p1.itemcode; 
1

這將不會有多餘的末處的逗號

SELECT ItemCode, SUM(Qty) AS Qty, 
    Replace( (SELECT x.Location as [data()] 
     FROM Putaway x 
     WHERE p.ItemCode = x.ItemCode 
     ORDER BY x.Location 
     FOR XML PATH ('')) , ' ', ',') as Locations 
FROM Putaway p 
GROUP BY ItemCode