这是我到目前为止所得到的,但结果是错误的。
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。
我仍然想让其他方式工作,但我认为这需要创建一个临时表或视图,可用于执行其中一个计算,然后从查询中调用它。这是我必须要弄清楚的事情。
感谢您尝试提供帮助。
答案 0 :(得分:1)
由于Access没有COUNT(DISTINCT)
,因此您需要创建内部查询。
这样做是计算内部查询中订单中每个项目的总和,然后将客户的所有订单总计作为购买总额。单个OrderID不会被计算两次,因为o
和od
现在具有一对一的关系。
某处可能存在语法错误,但这个想法应该有效。
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语句,它允许查询以我想要的方式运行。