2016-11-10 30 views
2

我相信这是一个非常简单的问题,其答案同样简单,但我无法弄清楚。如何填充唯一键的值

我有一个临时表建模像这样与该查询返回的数据,如下所示:

+--------+------+---------+---------+--------+-----------+--------+-----+ 
| 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 | 
+--------+------+---------+---------+-------------------+-----------+--------+-----+ 
+0

你已经混杂了一些事情。你的东西声明应该是'FROM @ temp',没有必要的表别名,而你的主查询应该有'FROM @temp t' – ZLK

+0

我认为150961应该是你最后一个记录中的项目#不是156961 – scsimon

+0

Woooow .... I不能相信我没有接受。谢谢!你能提交一个答案,以便我可以给你信用? – PhoenixFly

回答

0

的问题,因为在评论中提到的,是一个简单的mixup用那东西是怎么写的。调整后,查询应该像这样流口水,在stuff语句之外使用@temp的表别名:

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; 
0

这里有一种方法。我确定有更好的...但是对于你的结构它会起作用。 此外,认为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 #]