web-dev-qa-db-fra.com

Utiliser une colonne calculée dans une clause where

J'essaie d'utiliser une colonne calculée dans une clause where.

J'ai tout essayé, de CROSS APPLY à sous-requête, mais cela ne me donne rien de ce dont j'ai besoin.

Ma requête jusqu'à présent:

SELECT p.Code, c.AccountNumber, Sales = (SUM(p.UnitPrice) * SUM(od.QtyShipped)) FROM [dbo].Customer c 
    LEFT JOIN [dbo].OrderHeader oh ON oh.CustomerId = c.Id 
    LEFT JOIN [dbo].OrderDetail od ON od.OrderHeaderId = oh.Id
    LEFT JOIN [dbo].Product p ON p.Id = od.ProductId
WHERE Sales > 100
GROUP BY p.Code, c.AccountNumber, Sales

Cela ne fonctionne pas, car "Sales" est une colonne non valide

17
JadedEric

Vous devrez encapsuler la requête interne dans une table dérivée ou CTE afin de pouvoir utiliser des colonnes dérivées dans la clause WHERE (En outre, la note SUM() est spécifiée une seule fois, après la multiplication):

SELECT x.Code, x.AccountNumber, x.Sales
FROM
(
  SELECT p.Code, c.AccountNumber, SUM(p.UnitPrice *od.QtyShipped) AS Sales 
  FROM [dbo].Customer c 
      LEFT JOIN [dbo].OrderHeader oh ON oh.CustomerId = c.Id 
      LEFT JOIN [dbo].OrderDetail od ON od.OrderHeaderId = oh.Id
      LEFT JOIN [dbo].Product p ON p.Id = od.ProductId
  GROUP BY p.Code, c.AccountNumber
) AS x
WHERE x.Sales > 100;
22
StuartLC

Vous pouvez utiliser l'expression de table commune pour cela

`;WITH CTE AS
(
SELECT p.Code, c.AccountNumber, Sales = (SUM(p.UnitPrice) * SUM(od.QtyShipped)) FROM [dbo].Customer c 
    LEFT JOIN [dbo].OrderHeader oh ON oh.CustomerId = c.Id 
    LEFT JOIN [dbo].OrderDetail od ON od.OrderHeaderId = oh.Id
    LEFT JOIN [dbo].Product p ON p.Id = od.ProductId

GROUP BY p.Code, c.AccountNumber, Sale

)

SELECT
*
FROM 
CTE WHERE CTE.Sales>100 `
3
mindbdev