SQL查询请求Count&总

时间:2014-02-03 19:20:37

标签: sql sql-server

我已链接到数据库并要求完成以下查询。购买肉类/家禽类物品的所有客户的客户ID,公司名称,订单数量和总订单金额。这是我到目前为止所得到的,但不断出现错误。大多数问题远远高于班级水平,但我正在尽可能多地完成自己的工作。使用上一个问题的代码来帮助我。不确定它是否正确。

WITH CTE AS (

SELECT Customers.CustomerID, 
   Customers.CompanyName,
   Categories.CategoryName,
   COUNT(OrderID) AS total_orders,
   SUM(Quantity * UnitPrice) AS grand_total
   rn=ROW_NUMBER() OVER (ORDER BY Orders.OrderID)
FROM   Customers INNER JOIN
   Orders ON Orders.OrderID=Orders.CustomerID INNER JOIN
[Order Details] ON Orders.OrderID=[Order Details].OrderID
WHERE (Categories.CategoryName)= 'Meat/Poultry'

Group BY Orders.OrderID,
 Customers.CompanyName,
     Categories.CategoryName
)

SELECT  A.CustomerID,
A.CompanyName,
    A.total_orders,
A.grand_total,
(SELECT SUM(grand_total), COUNT(total_orders))
FROM CTE B
WHERE   B.grand_total > A.grand_total) RunningTotal
FROM CTE A
ORDER BY RunningTotal

SQL查询可以分解并在以后合并吗?我想也许这会让代码变得更简单。除了我目前使用的方法之外,是否有方法或工具可以帮助初学者?

感谢,

1 个答案:

答案 0 :(得分:1)

在构建this SQL Fiddle时,我对您的架构进行了一些猜测。我还构建了两个不同的查询,因为我发现这个要求含糊不清:

  

购买肉类/家禽类物品的所有客户的客户ID,公司名称,订单数量和总订单金额。

所有订单中仅肉类/家禽产品的总和,由客户提供:

SELECT 
  c.CustomerID, c.CompanyName,
  OrderCount = COUNT(DISTINCT od.OrderID),
  [Meat/Poultry Total] = SUM(od.Quantity * od.UnitPrice)
FROM dbo.Customers AS c
INNER JOIN dbo.Orders AS o
ON c.CustomerID = o.CustomerID
INNER JOIN dbo.OrderDetails AS od
ON o.OrderID = od.OrderID
INNER JOIN dbo.Products AS p
ON od.ProductID = p.ProductID
INNER JOIN dbo.Categories AS cat
ON p.CategoryID = cat.CategoryID
WHERE cat.CategoryName = 'Meat/Poultry'
GROUP BY c.CustomerID, c.CompanyName;

每个订单中至少有一个项目是肉类/家禽(按客户)的所有订单总和:

SELECT
  c.CustomerID, c.CompanyName,
  OrderCount = COUNT(DISTINCT o.OrderID),
  GrandTotal = SUM(od.Quantity * od.UnitPrice)
FROM dbo.Customers AS c
INNER JOIN dbo.Orders AS o
ON c.CustomerID = o.CustomerID
INNER JOIN dbo.OrderDetails AS od
ON o.OrderID = od.OrderID
WHERE EXISTS
(
  SELECT 1 FROM dbo.OrderDetails AS od2
    INNER JOIN dbo.Products AS p
    ON p.ProductID = od2.ProductID
    INNER JOIN dbo.Categories AS cat
    ON p.CategoryID = cat.CategoryID
    WHERE cat.CategoryName = 'Meat/Poultry'
    AND od2.OrderID = o.OrderID
)
GROUP BY c.CustomerID, c.CompanyName;

请注意,客户#3从未输入任何这些结果......