2015-02-09 55 views
0

我正在編寫一些基本庫存控制系統,需要計算一些數字以從供應商那裏訂購。重複使用SQL查詢或視圖中的計算列

我希望做的是這樣的查詢:

SELECT [Articles].[ArticleId] 
     ,(SELECT COALESCE(SUM([Quantity]),0) FROM [dbo].[InventoryTable] WHERE [InventoryTable].ArticleId = [Articles].[ArticleId]) AS 'QuantityInStorage' 
     ,(SELECT COALESCE(SUM([Quantity]),0) FROM [dbo].[CustomerOrdersTable] WHERE [CustomerOrdersTable].ArticleId = [Articles].[ArticleId]) AS 'QuantityDeliverToCustomers' 
     ,(SELECT COALESCE(SUM([Quantity]),0) FROM [dbo].[SupplierOrdersTable] WHERE [SupplierOrdersTable].ArticleId = [Articles].[ArticleId]) AS 'QuantityOrderedFromSupplier' 
     ,[Reorderlevel] 
     ,[RefillQuantityToLevel] 
     ,CASE 
      WHEN [Reorderlevel] <> 0 THEN ([QuantityInStorage]+[QuantityOrderedFromSupplier]-[QuantityDeliverToCustomers])*100/[Reorderlevel] -- compute how important it is to restock on this item 
      WHEN ([QuantityInStorage]+[QuantityOrderedFromSupplier]-[QuantityDeliverToCustomers]) < 0 THEN -1 -- we don't want the article in storage but need to order it to send it to customers 
      ELSE 999 -- unimportant, don't order this stuff 
      END AS 'Importance' -- below zero is very important (need article to send to customer), below 100 is some kind important (refill storage), above 100 is not important 
    FROM [Articles] 
    WHERE [QuantityInStorage]-[QuantityDeliverToCustomers]+[QuantityOrderedFromSupplier]<[RefillQuantityToLevel] 
    ORDER BY [Importance] 

我的問題是:我怎樣才能重新使用計算列像我嘗試在我的例子嗎?如果我嘗試這樣,SQL Server總是顯示一個錯誤。

+0

蕩。我搜索了兩個小時而沒有發現 - 謝謝! – Sam 2015-02-09 11:51:10

回答

1

將查詢設爲subselect您不能在同一個select語句中使用別名。

SELECT *, 
     CASE 
     WHEN [Reorderlevel] <> 0 THEN ([QuantityInStorage] 
             + [QuantityOrderedFromSupplier] - [QuantityDeliverToCustomers]) * 100/[Reorderlevel] -- compute how important it is to restock on this item 
     WHEN ([QuantityInStorage] 
       + [QuantityOrderedFromSupplier] - [QuantityDeliverToCustomers]) < 0 THEN -1 -- we don't want the article in storage but need to order it to send it to customers 
     ELSE 999 -- unimportant, don't order this stuff 
     END AS 'Importance' -- below zero is very important (need article to send to customer), below 100 is some kind important (refill storage), above 100 is not important 
FROM (SELECT [Articles].[ArticleId], 
       (SELECT COALESCE(Sum([Quantity]), 0) 
       FROM [dbo].[InventoryTable] 
       WHERE [InventoryTable].ArticleId = [Articles].[ArticleId])  AS 'QuantityInStorage', 
       (SELECT COALESCE(Sum([Quantity]), 0) 
       FROM [dbo].[CustomerOrdersTable] 
       WHERE [CustomerOrdersTable].ArticleId = [Articles].[ArticleId]) AS 'QuantityDeliverToCustomers', 
       (SELECT COALESCE(Sum([Quantity]), 0) 
       FROM [dbo].[SupplierOrdersTable] 
       WHERE [SupplierOrdersTable].ArticleId = [Articles].[ArticleId]) AS 'QuantityOrderedFromSupplier', 
       [Reorderlevel], 
       [RefillQuantityToLevel], 
       [Importance] 
     FROM [Articles]) a 
WHERE [QuantityInStorage] - [QuantityDeliverToCustomers] + [QuantityOrderedFromSupplier] < [RefillQuantityToLevel] 
ORDER BY [Importance] 
1

使用外適用:

SELECT [Articles].[ArticleId] 
     ,x.[QuantityInStorage] 
     ,y.[QuantityDeliverToCustomers] 
     ,z.[QuantityOrderedFromSupplier] 
     ,[Reorderlevel] 
     ,[RefillQuantityToLevel] 
     ,CASE 
     WHEN [Reorderlevel] <> 0 THEN ([QuantityInStorage]+[QuantityOrderedFromSupplier]-[QuantityDeliverToCustomers])*100/[Reorderlevel] -- compute how important it is to restock on this item 
     WHEN ([QuantityInStorage]+[QuantityOrderedFromSupplier]-[QuantityDeliverToCustomers]) < 0 THEN -1 -- we don't want the article in storage but need to order it to send it to customers 
     ELSE 999 -- unimportant, don't order this stuff 
     END AS [Importance] -- below zero is very important (need article to send to customer), below 100 is some kind important (refill storage), above 100 is not important 
FROM [Articles] 
OUTER APPLY 
    (SELECT COALESCE(SUM([Quantity]),0) [QuantityInStorage] FROM [dbo].[InventoryTable] WHERE [InventoryTable].ArticleId = [Articles].[ArticleId]) x 
OUTER APPLY 
    (SELECT COALESCE(SUM([Quantity]),0) [QuantityDeliverToCustomers] FROM [dbo].[CustomerOrdersTable] WHERE [CustomerOrdersTable].ArticleId = [Articles].[ArticleId]) y 
OUTER APPLY 
    (SELECT COALESCE(SUM([Quantity]),0) [QuantityOrderedFromSupplier] FROM [dbo].[SupplierOrdersTable] WHERE [SupplierOrdersTable].ArticleId = [Articles].[ArticleId]) z 
WHERE [QuantityInStorage]-[QuantityDeliverToCustomers]+[QuantityOrderedFromSupplier]<[RefillQuantityToLevel] 
ORDER BY [Importance] 
1

未經檢驗的,但這樣的事情應該這樣做:

with QuantityInStorage as (
    SELECT [InventoryTable].ArticleId, COALESCE(SUM([Quantity]),0) as Quantity FROM [dbo].[InventoryTable] GROUP BY [InventoryTable].ArticleId 
) 
, QuantityDeliverToCustomers as (
    SELECT [CustomerOrdersTable].ArticleId, COALESCE(SUM([Quantity]),0) as Quantity FROM [dbo].[CustomerOrdersTable] GROUP BY [CustomerOrdersTable].ArticleId 
) 
,QuantityOrderedFromSupplier as (
    SELECT [SupplierOrdersTable].ArticleId, COALESCE(SUM([Quantity]),0) AS Quantity FROM [dbo].[SupplierOrdersTable] GROUP BY [SupplierOrdersTable].ArticleId 
) 
SELECT [Articles].[ArticleId] 
     , QuantityInStorage.Quantity as QuantityInStorage 
     , QuantityDeliverToCustomers.Quantity AS QuantityDeliverToCustomers 
     , QuantityOrderedFromSupplier.Quantity as QuantityOrderedFromSupplier 
     ,[Reorderlevel] 
     ,[RefillQuantityToLevel] 
     ,CASE 
      WHEN [Reorderlevel] <> 0 THEN (QuantityInStorage.Quantity + QuantityOrderedFromSupplier.Quantity-QuantityDeliverToCustomers.Quantity)*100/[Reorderlevel] -- compute how important it is to restock on this item 
      WHEN (QuantityInStorage.Quantity+ QuantityOrderedFromSupplier.Quantity-QuantityDeliverToCustomers.Quantity) < 0 THEN -1 -- we don't want the article in storage but need to order it to send it to customers 
      ELSE 999 -- unimportant, don't order this stuff 
      END AS 'Importance' -- below zero is very important (need article to send to customer), below 100 is some kind important (refill storage), above 100 is not important 

FROM [Articles] 
LEFT OUTER JOIN QuantityInStorage ON QuantityInStorage.ArticleId=[Articles].ArticleId 
LEFT OUTER JOIN QuantityDeliverToCustomers ON QuantityDeliverToCustomers.ArticleId=[Articles].ArticleId 
LEFT OUTER JOIN QuantityOrderedFromSupplier ON QuantityOrderedFromSupplier.ArticleId=[Articles].ArticleId 
WHERE [QuantityInStorage].Quantity-[QuantityDeliverToCustomers].Quantity+[QuantityOrderedFromSupplier].Quantity<[RefillQuantityToLevel]