此SQL语句是否需要嵌套的SELECT查询?

时间:2013-09-12 23:54:05

标签: sql ms-access

这是我到目前为止所得到的,但结果是错误的。

SELECT c.CompanyName,
       COUNT(o.OrderID) AS [Total Orders],
       SUM(
           (od.UnitPrice -
           (od.UnitPrice * od.Discount))* Quantity) AS [Purchase Total]
FROM Customers AS c,
     Orders AS o,
     [Order Details] AS od
WHERE c.CustomerID = o.CustomerID
AND o.OrderID = od.OrderID
GROUP BY c.CompanyName
ORDER BY c.CompanyName;

我遇到的问题是计数,它是双重或更多。我认为这是因为OrderID在Order Details表中多次出现。我想我需要一个嵌套的SELECT语句,但我不确定如何做到这一点。

我是否会从第一个查询中删除SUM()表达式,Order Details和AND子句?还是我离开了?

在帮助下我得到了COUNT字段,但现在我的SUM字段错了。这是我最近的尝试,它为每个客户产生相同的价值。

SELECT c.CompanyName, 
       COUNT(o.OrderID) AS [Total Orders], 
        (SELECT SUM(
         (odIN.UnitPrice -
         (odIN.UnitPrice * odIN.Discount)) * odIN.Quantity) AS [OrderTotal]
         FROM [Order Details] AS odIN, Orders As oIN
         WHERE odIN.OrderID = oIN.OrderID) AS [Purchase Total]
FROM 
     Customers AS c, Orders AS o
WHERE c.CustomerID = o.CustomerID
GROUP BY c.CompanyName
ORDER BY c.CompanyName;

我没有成功地让查询完全按照我想要的方式工作。然后我意识到也许我正在寻找错误的数据。所以我将COUNT字段的名称切换为Num Products Purchased。

我仍然想让其他方式工作,但我认为这需要创建一个临时表或视图,可用于执行其中一个计算,然后从查询中调用它。这是我必须要弄清楚的事情。

感谢您尝试提供帮助。

3 个答案:

答案 0 :(得分:1)

由于Access没有COUNT(DISTINCT),因此您需要创建内部查询。

这样做是计算内部查询中订单中每个项目的总和,然后将客户的所有订单总计作为购买总额。单个OrderID不会被计算两次,因为ood现在具有一对一的关系。

某处可能存在语法错误,但这个想法应该有效。

SELECT c.CompanyName, 
       COUNT(o.OrderID) AS [Total Orders], 
       SUM(od.OrderTotal) AS [Purchase Total]
FROM 
     Customers AS c, 
     Orders AS o,
     (SELECT odIn.OrderID, 
         SUM(
         (odIn.UnitPrice -
         (odIn.UnitPrice * odIn.Discount)) * odIn.Quantity) AS [OrderTotal]
         FROM [Order Details] AS odIn
         GROUP BY odIn.OrderID) AS od
WHERE c.CustomerID = o.CustomerID
    AND o.OrderID = od.OrderID
GROUP BY c.CompanyName
ORDER BY c.CompanyName;

答案 1 :(得分:0)

如果问题是因为OrderID多次出现,请尝试:

SELECT c.CompanyName, COUNT(DISTINCT o.OrderID) AS [Total Orders], SUM((od.UnitPrice - (od.UnitPrice * od.Discount)) * Quantity) AS [Purchase Total]
FROM Customers AS c, Orders AS o, [Order Details] AS od
WHERE c.CustomerID = o.CustomerID AND o.OrderID = od.OrderID
GROUP BY c.CompanyName
ORDER BY c.CompanyName;

distinct子句允许您只计算每个外观。

答案 2 :(得分:0)

首先,我要感谢Daniel的帮助。我终于得到了查询以使用来自其他来源的帮助。 Daniel的解决方案更好,因为它需要的代码更少,甚至可以格式化货币总和。

这是我要工作的那个:

SELECT vtOrdCnt.*, ROUND(vtTotCost.PurchaseTotal, 2) AS [Purchase Total]
FROM
(
SELECT CustomerID, COUNT(OrderID) AS TotalOrders
FROM orders
GROUP BY CustomerID
) AS vtOrdCnt,
(
SELECT CustomerID, SUM(UnitPrice * (1-Discount)*Quantity) AS PurchaseTotal
FROM Orders AS o, [Order Details] AS od
WHERE o.orderID = od.orderID
GROUP BY CustomerID
) AS vtTotCost
WHERE vtOrdCnt.CustomerID = vtTotCost.CustomerID
ORDER BY  vtOrdCnt.CustomerId

通过在FROM子句中使用别名和两个select语句,它允许查询以我想要的方式运行。

相关问题