2017-06-05 52 views
0

我想用sql填充存储表。有两种类型的存储项目,产品和列。产品由cols组成,并有用于链接的“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 

我已经实现的方式列出任何产品或使用的cols需要qtys但不知道如何与单列出他们俩条款。最终结果包括几个带变量的WHERE快速缩小结果,例如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这两个?为什么cols表现得很慢?

我正在运行ms sql server express与自定义平台。

ps。对不起,命名不好的问题,只是不能拿出更好的一个..

+1

好一些表,如果你知道怎么做各,你可以使用一个工会结合每个然后'插入到表中选择工会B'?无论你的SQL我有点失去了你想要做的事情。看起来你需要加入prodcols来为productID存储一次,而colid则需要一个prodID和colID始终有一个值或其他空值。如果是这样,一个联合似乎是去这里的方式或一个有条件的'或联合'......但我认为工会更清洁/更容易维护。 – xQbert

+0

其他所有应该只是选择,但'itemOrderQTY'我需要为任一productID选择SUM(qty)或找出哪些pID使用某些colID和SUM数量的那些。 我得到它的工作方式也很慢,所以它可能有错误。 – rami

+1

编辑问题W /你的企图。更容易阅读。 – 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

我不这么认为,因为预期的结果在不同的行中有产品和种类。这会把他们放在同一个地方吗? – xQbert

+0

我不完全了解这些over/partition的工作方式,但明天我会试试,谢谢。 – rami