2017-06-05 8 views
0

私はストレージテーブルにSQLを設定しようとしています。ストレージアイテムには、商品とコラムの2つのタイプがあります。プロダクトはcolで構成され、リンクするためのテーブル 'prodcols'を持っています。どのように異なるオプションのAS値

私が持っている:

Orderlines 
- productID 
- orderQTY 

ProdCols 
- productID 
- colID 
- colQTY 

Storage 
- itemID (can be productID or colID) 
- itemType (Product or Col) 
- itemName 
- itemQTY 

必要な結果:

itemType | itemID | itemName | itemQTY | itemOrderQTY | itemFreeQTY 
Product | 1001 | *name* | 50  | 20   | 30 
Col  | C101 | *name* | 80  | 60   | 20 


    SUM of orderQTYs (of each productID) AS itemOrderQTY 
    itemQTY - itemOrderQTY AS itemFreeQTY 

    itemQTY is maintained by other parts of software 

を私が必要qtysで製品やcolsのどちらかを一覧表示する方法を達成しているが、単一でそれらの両方を一覧表示する方法がわかりません句。最終結果には、結果をすばやく絞り込むためのWHERE with変数が含まれています(itemNameなど)。

colsのための私の試みは、動作しますが遅いです:製品について

(SELECT ProdCols.ColQTY*(SELECT SUM(OrderQTY)FROM Orderlines WHERE productID 
IN (SELECT ProductID FROM ProdCols WHERE ProdCols.ColID=storage.itemID) AND ..) 
AS itemOrderQTY 
FROM Storage, Orderlines, ProdCols 
GROUP BY Storage.Itemid, Storage.type, Storage.name, Storage.qty.. 

これがうまく動作:

(SELECT SUM(orderlines.orderQTY) FROM orderlines 
    WHERE orderlines.productID=storage.itemID AND ...) AS itemOrderQTY 
    FROM storage, orderlines 
    GROUP BY storage.itemID,storage.itemType,storage.itemName, storage.ItemQTY 

は、これら二つのUNIONに方法はありますか?なぜ列車が非常に遅いのですか?

私はmsプラットフォームのSQL Server Expressをカスタムプラットフォームで実行しています。

ps。申し訳ありませんが、質問の名前を付けて、より良いものを考え出すことができませんでした。

+1

に基づいてテーブルのいくつかのために参加し、それぞれを組み合わせて、その後、 '選択テーブルに挿入組合B'? SQLのW/O私はあなたがやろうとしていることを少し失っています。 prodcolsをproductIDに1回、prodIDとcolIDが常に1つの値またはもう1つのnullを持つcolIdに一度結合する必要があるようです。もしそうなら、組合はここに行くか、条件付きの "または参加する"のように思われます...しかし、私は組合がより清潔で維持しやすいと思います。 – xQbert

+0

他のものはすべて選択するだけですが、 'itemOrderQTY'の場合はproductIDにSUM(qty)を選択するか、pIDが特定のcolIDとsum qtyを使用するかどうかを調べる必要があります。 私はそれが働いている方法も非常に実行するのが遅かったので、おそらく何か間違っています。 – rami

+1

あなたの試みで質問を編集してください。読むのが簡単です。 – xQbert

答えて

0

あなたはこのようなものをお探しですか?あなたがそれぞれを行う方法を知っていれば、あなたは労働組合を使用することができますが、内側に変更する必要があります

Select S.ItemName, S.itemQty, p.ProductId, p1.ColId, p1.ColQty, 
    Sum(o.OrderQty) over(partition by p.ProductId) as ItemOrderQty, 
    S.ItemQty - Sum(o.OrderQty) over(partition by p.ProductId) as ItemFreeQty 
from Storage s 
left join ProdCols p 
    on s.ItemId = P.ProductID 
    and s.itemType = 'Product' 
left join ProdCols P1 
    on s.ItemId = P.ColId 
    and s.itemType = 'Col' 
left join OrderLines o 
    on p.ProductId = o.ProductId 

はまああなたの条件

+0

期待される結果が異なる行のproductとcolの型を持っているので、私はそうは思わない。これは同じではないでしょうか? – xQbert

+0

私はこれらのオーバー/パーティションの仕組みがどう機能するのか正確には分かりませんが、明日はそれを試してみます。ありがとうございます。 – rami

関連する問題