SQL分组,将2行组合到一个单元格

时间:2011-09-28 16:28:45

标签: sql tsql

我有一些sql,它将数据分组以汇总它 它基本上是一个位置,项目和数量的列表。

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

如果我做了显而易见的事 - 只需将[Location]添加到SELECT和Group By 然后它为BBBB提供了2行,为CCCC等提供了3行(正是它应该是,但不是我想要它)

因此,由于表中的每个项目都有多行 - 如何对其进行汇总并将行[Location]的字段合并为1个字段。

我希望有一个简单的SQL解决方案,以避免我不得不编写某种类型的网页来实现它。

我希望这是有道理的。

3 个答案:

答案 0 :(得分: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 :(得分: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;

答案 2 :(得分:2)

最后不会有额外的逗号

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