Sql 如何仅从唯一键填充值
我相信这是一个非常简单的问题,答案也同样简单,但我无法理解 我有一个这样建模的临时表,查询返回的数据如下:Sql 如何仅从唯一键填充值,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我相信这是一个非常简单的问题,答案也同样简单,但我无法理解 我有一个这样建模的临时表,查询返回的数据如下: +--------+------+---------+---------+--------+-----------+--------+-----+ | Acct # | PO # | Store # | Order # | Line # | Ship Date | Item # | Qty | +--------+------+---------+---------+--------+--
+--------+------+---------+---------+--------+-----------+--------+-----+
| Acct # | PO # | Store # | Order # | Line # | Ship Date | Item # | Qty |
+--------+------+---------+---------+--------+-----------+--------+-----+
| 0777 | 3340 | 648 | 1756013 | 1 | 11/23/16 | 100598 | 1 |
| 0777 | 3340 | 648 | 1756013 | 2 | 11/23/16 | 100597 | 1 |
| 0777 | 3340 | 648 | 1756013 | 3 | 11/23/16 | 100598 | 1 |
| 0777 | 3340 | 648 | 1756013 | 4 | 11/23/16 | 100596 | 1 |
| 0777 | 3341 | 720 | 1760001 | 1 | 12/01/16 | 150962 | 1 |
| 0777 | 3341 | 720 | 1760001 | 3 | 12/01/16 | 100596 | 1 |
| 0777 | 3341 | 720 | 1760001 | 4 | 12/01/16 | 150961 | 1 |
| 0777 | 3341 | 720 | 1760001 | 7 | 12/01/16 | 150961 | 1 |
| 0777 | 3341 | 720 | 1760001 | 8 | 12/01/16 | 156961 | 1 |
+--------+------+---------+---------+--------+-----------+--------+-----+
我应该将类似的行合并在一起,以便对于订单号上相同的每个项目编号,数量从1增加到2,等等。我让这部分工作,但为了做到这一点,我必须去掉行号,因此返回的数据如下所示:
+--------+------+---------+---------+-----------+--------+-----+
| Acct # | PO # | Store # | Order # | Ship Date | Item # | Qty |
+--------+------+---------+---------+-----------+--------+-----+
| 0777 | 3340 | 648 | 1756013 | 11/23/16 | 100598 | 2 |
| 0777 | 3340 | 648 | 1756013 | 11/23/16 | 100597 | 1 |
| 0777 | 3340 | 648 | 1756013 | 11/23/16 | 100596 | 1 |
| 0777 | 3341 | 720 | 1760001 | 12/01/16 | 150962 | 1 |
| 0777 | 3341 | 720 | 1760001 | 12/01/16 | 100596 | 1 |
| 0777 | 3341 | 720 | 1760001 | 12/01/16 | 150961 | 3 |
+--------+------+---------+---------+-----------+--------+-----+
但是,我需要Line#列来准确地报告正在处理、装运的订单行等。我知道STUFF()函数可以做到这一点,除了它添加每一行,而不仅仅是特定于订单的行。我的问题是:
SELECT DISTINCT
SupplierAcctNumber AS 'Acct #',
BuyerPONumber AS 'PO #',
BuyerStoreNumber AS 'Store #',
SupplierOrderNumber AS 'Order #',
SupplierOrderLine =
STUFF((SELECT ',' + CAST(t.SupplierOrderLine AS VARCHAR)
FROM @temp t
WHERE t.SupplierOrderNumber = SupplierOrderNumber
AND t.BuyerItemNumber = BuyerItemNumber FOR XML PATH ('')),1,1,''),
SupplierShipDate AS 'Ship Date',
BuyerItemNumber AS 'Item #',
SUM(SupplierQtyOrdered) AS 'Qty'
FROM @temp
GROUP BY SupplierAcctNumber, BuyerPONumber, BuyerStoreNumber, SupplierOrderNumber,
SupplierOrderLine, SupplierShipDate, BuyerItemNumber
ORDER BY SupplierOrderNumber
以下是我得到的结果:
+--------+------+---------+---------+-------------------+-----------+--------+-----+
| Acct # | PO # | Store # | Order # | Line # | Ship Date | Item # | Qty |
+--------+------+---------+---------+-------------------+-----------+--------+-----+
| 0777 | 3340 | 648 | 1756013 | 1,2,3,4,1,3,4,7,8 | 11/23/16 | 100598 | 2 |
| 0777 | 3340 | 648 | 1756013 | 1,2,3,4,1,3,4,7,8 | 11/23/16 | 100597 | 1 |
| 0777 | 3340 | 648 | 1756013 | 1,2,3,4,1,3,4,7,8 | 11/23/16 | 100596 | 1 |
| 0777 | 3341 | 720 | 1760001 | 1,2,3,4,1,3,4,7,8 | 12/01/16 | 150962 | 1 |
| 0777 | 3341 | 720 | 1760001 | 1,2,3,4,1,3,4,7,8 | 12/01/16 | 100596 | 1 |
| 0777 | 3341 | 720 | 1760001 | 1,2,3,4,1,3,4,7,8 | 12/01/16 | 150961 | 3 |
+--------+------+---------+---------+-------------------+-----------+--------+-----+
以下是我预期的结果:
+--------+------+---------+---------+-------------------+-----------+--------+-----+
| Acct # | PO # | Store # | Order # | Line # | Ship Date | Item # | Qty |
+--------+------+---------+---------+-------------------+-----------+--------+-----+
| 0777 | 3340 | 648 | 1756013 | 1,3 | 11/23/16 | 100598 | 2 |
| 0777 | 3340 | 648 | 1756013 | 2 | 11/23/16 | 100597 | 1 |
| 0777 | 3340 | 648 | 1756013 | 4 | 11/23/16 | 100596 | 1 |
| 0777 | 3341 | 720 | 1760001 | 1 | 12/01/16 | 150962 | 1 |
| 0777 | 3341 | 720 | 1760001 | 3 | 12/01/16 | 100596 | 1 |
| 0777 | 3341 | 720 | 1760001 | 4,7,8 | 12/01/16 | 150961 | 3 |
+--------+------+---------+---------+-------------------+-----------+--------+-----+
这里有一条路。我相信还有更好的。。。但对于你的结构来说,它会起作用的。 另外,你认为150961应该是你上一次记录中的项目,而不是156961
select
[Acct #],
[PO #],
[Store #],
[Order #],
STUFF((SELECT ', ' + cast([Line #] as varchar) from #tt where [Order #] = t.[Order #] and [Item #] = t.[Item #] FOR XML PATH ('')), 1, 1, '') as [Line #],
[Ship Date],
[Item #],
SUM(Qty) as Qty
from #tt t
group by
[Acct #],
[PO #],
[Store #],
[Order #],
[Ship Date],
[Item #]
正如评论中提到的那样,这个问题只是简单地混淆了内容的编写方式。调整后,查询应如下所示,@temp的表别名位于stuff语句之外:
SELECT DISTINCT
SupplierAcctNumber AS 'Acct #',
BuyerPONumber AS 'PO #',
BuyerStoreNumber AS 'Store #',
SupplierOrderNumber AS 'Order #',
SupplierOrderLine =
STUFF((SELECT ',' + CAST(t.SupplierOrderLine AS VARCHAR)
FROM @temp
WHERE t.SupplierOrderNumber = SupplierOrderNumber
AND t.BuyerItemNumber = BuyerItemNumber FOR XML PATH ('')),1,1,''),
SupplierShipDate AS 'Ship Date',
BuyerItemNumber AS 'Item #',
SUM(SupplierQtyOrdered) AS 'Qty'
FROM @temp t
GROUP BY SupplierAcctNumber, BuyerPONumber, BuyerStoreNumber, SupplierOrderNumber,
SupplierOrderLine, SupplierShipDate, BuyerItemNumber
ORDER BY SupplierOrderNumber;
你把事情搞混了。你的stuff语句应该是@temp中的
而不需要表别名,你的主查询应该是@temp t
中的我认为150961应该是你上一条记录中的项目,而不是15696wooow。。。。我真不敢相信我没听懂。非常感谢。你能给我一个答案让我给你评分吗?@scsimon你是对的。我只是插入了虚拟数据,没有引起足够的注意。@ZLK你能发布你的答案吗?这样我就可以相信你先弄明白了吗?