3

我的数据库中有两个表如下:

CUSTOMER (
  ID integer Generated Always As Identity,
  FIRSTNAME varchar(32) not null,
  LASTNAME varchar(32) not null,
  PHONENUMBER varchar(11) not null,
  ADDRESS varchar(225),
primary key (id)
);

APP.ORDERS (
  ID integer not null default AUTOINCREMENT: start 1 increment 1,
  CUSTOMER_ID integer References Customer(ID) ,
  EMPLOYEEID integer References Employee(ID),
  DATEOFDELIVERY date,
  primary key (id),
); 

当我尝试加入这两个表时,如下所示,一切都很好:

 SELECT CUSTOMER_ID,firstname,LASTNAME,Address,phoneNumber From APP.Customer 
 INNER JOIN APP.Orders ON customer.ID = customer_ID 
 WHERE ORDERS.dateOfDelivery Between '2012-09-01' AND '2012-11-11'

但是当我使用如下聚合函数时,它给了我错误:

SELECT Count(CUSTOMER_ID),firstname,LASTNAME,Address,phoneNumber 
From APP.Customer                         
INNER JOIN APP.Orders ON customer.ID = customer_ID 
WHERE ORDERS.dateOfDelivery Between '2012-09-01' AND '2012-11-11' ;

错误:

[2012-07-20 08:07:04] [42Y35][30000] Column reference 'FIRSTNAME' is invalid. When the SELECT list contains at least one aggregate then all entries must be valid aggregate expressions.  

我尝试将上面的最后一个代码更改为 Orders.Count(CUSTOMR_ID) 以告诉数据库正确的表,但它给我的错误是没有名称为 Orders 的模式,所以我将其更改为 APP.Orders.Count(CUSTOMER_ID) 但它永远解决不了问题。错误 :Schema 'ORDERS' does not exist

更新问题:

我想出那个非常简单的查询:

SELECT COUNT(*),ID FROM Orders

将导致此错误:

[2012-07-20 09:01:50] [42Y35][30000] Column reference 'ID' is invalid. When the SELECT list contains at least one aggregate then all entries must be valid aggregate expressions. 

所以这意味着不可能同时拥有聚合函数和简单的列名,但我想知道如何用任何等效的查询提供预期的输出?任何的想法?

4

3 回答 3

4

GROUP BY 是正确的方法。您需要按所有非聚合列进行分组,如下所示:

SELECT Count(CUSTOMER_ID),firstname,LASTNAME,Address,phoneNumber 
From APP.Customer                         
INNER JOIN APP.Orders ON customer.ID = customer_ID 
WHERE ORDERS.dateOfDelivery Between '2012-09-01' AND '2012-11-11' 
group by firstname,lastname,address,phonenumber;

可以这样想:你想收集一个特定客户的所有订单(这就是 GROUP BY 所做的),然后你想计算所有这些订单(这就是 COUNT() 函数所做的)。

于 2012-07-20T14:29:31.447 回答
2

试试这个

SELECT CUSTOMER_ID,Count(CUSTOMER_ID),firstname,LASTNAME,Address,phoneNumber 
From APP.Customer                         
INNER JOIN APP.Orders ON customer.ID = customer_ID 
WHERE ORDERS.dateOfDelivery Between '2012-09-01' AND '2012-11-11' 
GROUP BY CUSTOMER_ID,firstname,LASTNAME,Address,phoneNumber 
于 2012-07-20T03:56:03.730 回答
0

derby 数据库中的等效查询如下:

SELECT customer.firstName As FirstName ,
       customer.lastName AS LastName,
       customer.phoneNumber AS Telephone,
       customer.address AS Address, 
       (SELECT COUNT(OrderID) FROM Orders)  
  FROM Customer join Orders On orders.customer_ID = customer.id WHERE orders.dateOfDelivery Between '2012-09-01' And '2012-11-11'

事实是这个数据库不能像其他数据库那样实现同时包含聚合函数和列名的查询。我提到的等效查询将给出相同的输出,但根据http://old.nabble.com/Nested-query-in-conjunction-with-ordering---unreasonably-slow-td15259785.html它的性能不是好。Bryan Pendleton 提到的查询也与此查询等效。

于 2012-07-20T17:34:26.090 回答