2017-06-05 3 views
0

Ich versuche, Speichertabelle mit SQL zu füllen. Es gibt zwei Arten von Speicherelementen, Produkten und Spalten. Produkte bestehen aus Spalten und haben Tabellen "Produkte" zum Verknüpfen.Wie SELECT verschiedene Optionen AS Wert

ich habe:

Orderlines 
- productID 
- orderQTY 

ProdCols 
- productID 
- colID 
- colQTY 

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

benötigt Ergebnis:

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 

ich einen Weg erreicht haben, entweder Produkte oder cols mit benötigt qtys zur Liste aber nicht wissen, wie sie zur Liste sowohl mit Single Klausel. Das Endergebnis enthält einige WHERE mit Variablen, um die Ergebnisse schnell einzugrenzen, z. B. itemName.

Mein Versuch für cols, funktioniert aber nur langsam:

(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.. 

Für Produkte, das funktioniert ok:

(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 

Gibt es eine Möglichkeit, diese zwei zu UNION? Warum läuft der für Cols sehr langsam?

Ich benutze MS SQL Server Express mit benutzerdefinierten Plattform.

ps. Entschuldigung für schlechte Benennung für Frage, konnte einfach nicht mit besseren ..

+1

Nun, wenn Sie wissen, wie jeder zu tun, können Sie eine Vereinigung verwenden jeweils kombinieren und dann 'in Tabelle einfügen wählen Eine Vereinigung B'? Ohne deine SQL bin ich etwas verloren in dem, was du versuchst zu tun. Es sieht so aus, als müssten Sie prodcols einmal für productID und einmal für colId mit prodID und cOLID mit dem Speicher verbinden, der immer einen Wert oder die andere Null hat. Wenn ja, scheint eine Gewerkschaft der Weg zu sein, hier zu gehen oder eine bedingte "oder beitreten" ... aber ich denke, die Union ist sauberer/leichter zu pflegen. – xQbert

+0

Alles andere sollte nur auswählen, aber für 'itemOrderQTY' muss ich SUMME (Menge) für jede Produkt-ID auswählen oder herausfinden, welche PIDs bestimmte COLID- und SUM-Mengen davon verwenden. Die Art, wie ich es funktionierte, war auch sehr langsam durchzuführen, so hat es wahrscheinlich etwas falsch .. – rami

+1

Bearbeiten Sie die Frage mit Ihrem Versuch. leichter zu lesen. – xQbert

Antwort

0

Sie suchen etwas in der Art?

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 

Sie benötigt möglicherweise zu inneren ändern registrieren einige der Tabellen auf der Grundlage Ihrer Anforderung

+0

Ich glaube nicht, da die erwarteten Ergebnisse Produkt- und Col-Typen in verschiedenen Zeilen haben. Das würde sie in die gleiche setzen, oder? – xQbert

+0

Ich verstehe nicht genau, wie diese Over/Partition Dinge funktionieren, aber ich werde es morgen versuchen, danke. – rami