我有一些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解决方案,以避免我不得不编写某种类型的网页来实现它。
我希望这是有道理的。
答案 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