0

我正在使用示例数据库,我想在表上编写一个查询,CustomersOrders提供所有已下达 2 个以上订单的客户。虽然我通过查询实现了这一点:

Select Customers.*
From Customers
Where Customers.CustomerID IN(
Select Orders.CustomerID
From Orders
Group by Orders.CustomerID
Having count(*)>2
);

我不明白为什么要查询:

SELECT Customers.*
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID
GROUP BY Customers.CustomerID
HAVING COUNT(*)>2;

不能给出相同的结果。来自数据库的消息是:

“无法对使用 '*'(客户)选择的字段进行分组。”

我的印象是它应该可以工作,因为Customers.CustomerID它包含在Select声明中要求的列中。有什么问题,我如何修改第二个查询才能工作,即使它执行了可能是多余的语句?

4

3 回答 3

0

SQL GROUP BY 语句

GROUP BY 语句与聚合函数一起使用,以按一列或多列对结果集进行分组。

SQL GROUP BY Syntax

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

因此,对于使用聚合,您需要指定要聚合的列,并且不能使用*

您必须在SELECTandGROUP BY子句中专门指定列。

于 2013-09-04T07:03:57.137 回答
0

SELECT在语句中指定您需要的列:

SELECT Customers.CustomerID, Customers.CustomerName
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID
GROUP BY Customers.CustomerID, Customers.CustomerName
HAVING COUNT(*)>2;
于 2013-09-04T07:04:35.487 回答
0

您的第一个解决方案实际上由两个查询组成

第二部分用于通过列出 CustomerID 来确定回头客

        Select o.CustomerID
    From Sales.SalesOrderHeader o
    Group by o.CustomerID
    Having count(*)>2

第一部分使用第二个查询获得的返回客户列表显示客户详细信息

Select c.*
From Sales.Customer c
Where 
c.CustomerID IN(
    ...
);

尝试使用 Order 表上的 Group By 语法获取重复的客户 ID 时,无法返回所有客户数据

但是这里可以使用带有 PARTITION BY 子句的 SQL 聚合函数(下面的计数函数)而不是 Group By 请查看教程http://www.kodyaz.com/t-sql/sql-count-function-with-partition- by-clause.aspx并查看以下查询

select * from (
SELECT distinct
    c.*,
    COUNT(o.SalesOrderID) over (partition by c.CustomerId) cnt
FROM Sales.SalesOrderHeader o
INNER JOIN Sales.Customer c ON o.CustomerID = c.CustomerID
) t where cnt > 1
于 2013-09-04T08:04:41.033 回答