2010-02-08 106 views
1

我想統計客戶曾經擁有的所有訂單上的訂單明細行總數。需要SQL子查詢幫助

這是我的查詢

SELECT SUM(
      (SELECT count(*) 
      FROM dbo.Order_Details 
      WHERE dbo.Order_Details.OrderID = dbo.Orders.OrderID)) 
    FROM dbo.Orders 
    WHERE dbo.Orders.CustomerID = "123" 

的SQL Server是給我的錯誤「不能對包含聚合或子查詢的表達式執行聚合的功能。」

任何幫助,這將不勝感激。

+0

你的表格是什麼樣的? – 2010-02-08 02:12:48

回答

0

它不應該僅僅是:

SELECT count(*) FROM dbo.Order_Details, dbo.Orders 
WHERE dbo.Order_Details.OrderID = dbo.Orders.OrderID 
AND dbo.Orders.CustomerID = "123" 
0

您不需要sum(),因爲count(*)已經會給你總數。

SELECT (SELECT count(*) 
    FROM dbo.Order_Details 
    WHERE dbo.Order_Details.OrderID = dbo.Orders.OrderID) 
FROM dbo.Orders 
WHERE dbo.Orders.CustomerID = "123" 
0

的COUNT(*)是做總和爲您服務。只需從表達式中移除SUM聚合。

0

我覺得像下面應該做你想要什麼:

select count(1) from dbo.order_details d 
join dbo.orders o on d.OrderId=o.OrderId 
where dbo.orders.CustomerID="123" 
3
SELECT COUNT(*) 
FROM Orders 
    INNER JOIN Order_Details ON Orders.OrderID = Order_Details.OrderID 
WHERE Orders.CustomerID = "123" 
+0

+1:這與我發佈的查詢完全相同,但語法不同。 (INNER JOIN vs WHERE子句)。 SQL Server顯然優化了這兩個相對相同的性能,如下所述:http://www.bennadel.com/blog/284-SQL-Optimization-And-ON-Clause-vs-WHERE-Clause.htm 當我在當前作業中開始使用Oracle時,所有連接都使用WHERE子句編寫,並且我習慣了INNER JOIN語法(和SQL Server)。現在我已經開始喜歡用於連接的WHERE子句,但在使用不同的DBMS時,瞭解這兩種形式非常重要。 – 2010-02-08 17:50:02

+0

雅,兩者都很好。我更喜歡INNER JOIN語法,因爲它更易於閱讀(我認爲) – Miles 2010-02-12 02:54:08

0

下面假設你在叫OrderDetailID的ORDER_DETAILS表中的列。如果不是,只需替換訂單明細記錄的唯一標識符即可。

SELECT COUNT(DISTINCT OD.OrderDetailID) 
FROM Orders O 
    LEFT JOIN Order_Details OD on (OD.OrderId = O.OrderId) 
WHERE O.CustomerID = "123"