2011-09-28 39 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