0

いくつかの手順を自動化しようとしています。スケジュールに従ってデータをダンプするクエリを設定する必要があります。私が抱えている問題は、SQLテーブルから1行のデータを取得し、それを複数行のデータにダンプすることです。SQLテーブルは部品注文フォームに使用され、最大10個の部品を入力するためのフィールド(Part01〜Part10)と各部品の数量を表すフィールド(Qty01〜Qty10)があります。ほとんどの注文と同様に、すべての注文で10行すべてを使用しているわけではないため、エクスポートするときに、パーツフィールド(PartXX <>'')にデータがあるかどうかをテストして、実際にデータ。テーブルには、変更されていなくても、各出力行に入力する必要のあるフィールドもあります。最初の「行」のクエリは簡単ですが、私の障害は「IF/THEN」です

私が探している出力は次のようなものです。

チケット番号CustIDアカウントラインShipAttnShipAddShipCity ShipState ShipZip Part Qty
123456 Cust019874651ジョースミスアドレスAnyTownIL01234キー2
123456 Cust019874562ジョースミスアドレスAnyTownIL01234ロック2

どんな方向でも大歓迎です。

4

3 に答える 3

0

探しているのは、ピボットテーブル (または「クロス集計」) です。すべての RDBMS には、そのための独自のソリューションがありますが、提供できませんでした。正確な構文も RDBMS によって異なります。

標準 SQL クエリは次のようになります。

SELECT Ticket#, CustID, Account, 1 AS Line, ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part01 AS Part, Qty01 AS Qty
FROM   tbl
WHERE  Part01 IS NOT NULL

UNION ALL
SELECT Ticket#, CustID, Account, 2 AS Line, ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part02 AS Part, Qty02 AS Qty
FROM   tbl
WHERE  Part02 IS NOT NULL

UNION ALL ...

ORDER BY Ticket#, CustID, Account, Line

ORDER BYクエリの最後のレグだけでなく、完全な結果に適用されます。したがって、副選択または CTE は必要ありません。

于 2013-02-06T18:19:55.037 に答える
0

正確なスキーマがわからない場合は、次のようにしてレコードのピボットを解除してみてください。

;with cte as (
    -- Select for each Part/Qty:
    select Ticket#, CustID, Account, ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part01 as Part, Qty01 as Qty, 1 as Line
    from Orders
    where Part01 is not null and Qty01 is not null
    union all
    select Ticket#, CustID, Account, ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part02 as Part, Qty02 as Qty, 2 as Line -- 02!
    from Orders
    where Part02 is not null and Qty02 is not null -- 02!
    union all
    select Ticket#, CustID, Account, ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part03 as Part, Qty03 as Qty, 3 as Line -- 03!
    from Orders
    where Part03 is not null and Qty03 is not null -- 03!
    --union all...keep going with 04 - 10
)
select Ticket#, CustID, Account
    , row_number() over (partition by Ticket# order by Line) as Line
    , ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part, Qty
from cte
order by Ticket#, Line
于 2013-02-06T18:19:06.820 に答える
0

SQL Server 2008 R2 を使用しているため、上記の両方のソリューションには Union が必要です。UnPivot の組み込み機能を使用することをお勧めします。まだテストされていませんが、動作するはずです。

説明されているソリューションに基づいています: http://mangalpardeshi.blogspot.com/2009/04/unpivot-multiple-columns.html

SELECT Ticket#, CustID, Account
    , row_number() over (partition by Ticket# order by Parts) as Line
    , ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip, Part, Qty 
FROM 
( 
SELECT Ticket#, CustID, Account , ShipAttn, ShipAdd, ShipCity, ShipState, ShipZip,
       Part01, Part02, Part03, Part04, Part05, Part06, Part07, Part08, Part09, Part10,
       Qty01, Qty02, Qty03, Qty04, Qty05, Qty06, Qty07, Qty08, Qty09, Qty10
FROM Suppliers 
) Main
UNPIVOT 
( 
Part FOR Parts IN (Part01, Part02, Part03, Part04, Part05, Part06, Part07, Part08, Part09, Part10) 
) P


UNPIVOT 
( 
Qty For Qtys IN (Qty01, Qty02, Qty03, Qty04, Qty05, Qty06, Qty07, Qty08, Qty09, Qty10) 
) Q

WHERE RIGHT(Parts,2) =  RIGHT(Qtys,2)
于 2013-02-07T21:01:36.403 に答える