I have the following SQL Query, but it is very repetitive and so I am wondering if this can be cleaned up by storing the results of a SQL Query in a variable.
What I have is (which works, can be tested here)
SELECT ProductName FROM (
  SELECT ProductName, SUM(Quantity) AS ProductQuantity FROM
    (SELECT CustomerID FROM Customers AS C
    WHERE Country = 'Germany') AS CG
  INNER JOIN Orders AS O
  ON CG.CustomerID = O.CustomerID
  INNER JOIN OrderDetails AS OD
  ON O.OrderID = OD.OrderID
  INNER JOIN Products as P
  ON OD.ProductID = P.ProductID
  GROUP BY ProductName)
WHERE ProductQuantity = (
SELECT MAX(ProductQuantity) FROM (
  SELECT ProductName, SUM(Quantity) AS ProductQuantity FROM
  (SELECT CustomerID FROM Customers AS C
  WHERE Country = 'Germany') AS CG
  INNER JOIN Orders AS O
  ON CG.CustomerID = O.CustomerID
  INNER JOIN OrderDetails AS OD
  ON O.OrderID = OD.OrderID
  INNER JOIN Products as P
  ON OD.ProductID = P.ProductID
  GROUP BY ProductName))
And as you could tell the following code is repeated twice, is there any way I can do this without repeating this code:
(SELECT ProductName, SUM(Quantity) AS ProductQuantity FROM (SELECT CustomerID FROM Customers AS C WHERE Country = 'Germany') AS CG INNER JOIN Orders AS O ON CG.CustomerID = O.CustomerID INNER JOIN OrderDetails AS OD ON O.OrderID = OD.OrderID INNER JOIN Products as P ON OD.ProductID = P.ProductID GROUP BY ProductName)
Advertisement
Answer
You can use CTE to avoid looping, maybe like this:
with cte as (
      SELECT ProductName, SUM(Quantity) AS ProductQuantity FROM
      (SELECT CustomerID FROM Customers AS C
      WHERE Country = 'Germany') AS CG
      INNER JOIN Orders AS O
      ON CG.CustomerID = O.CustomerID
      INNER JOIN OrderDetails AS OD
      ON O.OrderID = OD.OrderID
      INNER JOIN Products as P
      ON OD.ProductID = P.ProductID
      GROUP BY ProductName
    )
SELECT ProductName 
FROM cte
where ProductQuantity = (SELECT MAX(ProductQuantity) FROM cte)