2015-02-09 2 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

Dang. Я искал два часа, не найдя этого - спасибо! – Sam

ответ

1

Сделайте запрос как subselect, вы не можете использовать псевдоним в том же предложении выбора.

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]