2016-11-10 10 views
2

これは非常に簡単な質問で、これと同じように単純な答えだと思いますが、これを理解することはできません。ユニークなキーから値を取り込む方法

私はそうのようなので、クエリが返すデータのようにモデル化し、一時テーブルがあります、数量等、1から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 | 
+--------+------+---------+---------+--------+-----------+--------+-----+ 

を注文番号で同じ品目番号ごとに表示されます。しかし、私は正確にどの順序で報告するライン#列を必要とする

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

:私は、私は、行番号を取り除くために持っていたので、データが返されたことをやるために働くが、この部分は、このようになりますしています私が知っているのは、STUFF()関数はOrder#に固有のものだけでなく、すべてのLine#を追加する点を除いてこれを行うことができるということです。ここに私のクエリは次のとおりです。

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

あなたが持っているものが混ざっ。あなたのstuffステートメントは 'FROM @ temp'でなければなりません。テーブルのエイリアスは必要ありません。メインクエリは' FROM @temp t'でなければなりません。 – ZLK

+0

150961は最後のレコードのアイテム#ではないと思います156961 – scsimon

+0

Woooow ....私はそれをキャッチしなかったと信じることはできません。ありがとうございました!私はあなたに信用を与えることができるように答えを提出できますか? – PhoenixFly

答えて

0

問題であるべきだと思う、STUFFが書かれた方法と簡単な重複が整理されます。調整後、クエリはスタッフ文の外@tempのための表の別名で、このようlooke必要があります。

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

は、ここに1つの方法です。私は良いことがあると確信しています...しかし、あなたの構造のために働くでしょう。 はまた、コメントで述べたように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 #] 
関連する問題