如何在where子句中使用聚合值

3
我在使用Postgresql 9.4时遇到了一个问题,我希望程序只展示sum(v.price) > 1000,但是如果我在where条件中输入total > 1000,程序会提示total不存在,同时不允许我输入sum(v.price),因为在这个部分无法进行这种操作。
创建的表格如下:
  CREATE TABLE PATIENT
  (
    Pat_Number  INTEGER,
    Name    VARCHAR(50) NOT NULL,
    Address     VARCHAR(50) NOT NULL,
    City        VARCHAR(30) NOT NULL,
    CONSTRAINT pk_PATIENT PRIMARY KEY (Pat_Number)
);

CREATE TABLE VISIT
(
    Doc_Number    INTEGER,
    Pat_Number    INTEGER,
    Visit_Date    DATE,
    Price           DECIMAL(7,2),
     Turn               INTEGER NOT NULL,
    CONSTRAINT Visit_pk PRIMARY KEY (Doc_Number, Pat_Number, Visit_Date),
    CONSTRAINT Visit_Doctor_fk FOREIGN KEY (Doc_Number) REFERENCES DOCTOR(Doc_Number),
    CONSTRAINT Visit_PATIENT_fk FOREIGN KEY (Pat_Number) REFERENCES PATIENT(Pat_Number)
);

这是我遇到问题的陈述:

 SELECT 
     p.name, p.address, p.city, sum(v.price) as total
 FROM 
     VISIT v 
 JOIN 
     PATIENT p ON p.Pat_Number = v.Pat_Number
 WHERE 
     Date(Visit_Date) < '01/01/2012'      
 GROUP BY
     p.name, p.address, p.city, p.Pat_Number, v.Pat_Number
 ORDER BY 
     total DESC;

我该怎么做呢?

4个回答

3
group by之后添加Having sum(v.price) > 1000
SELECT 
     p.name, p.address, p.city, sum(v.price) as total
 FROM 
     VISIT v 
 JOIN 
     PATIENT p ON p.Pat_Number = v.Pat_Number
 WHERE 
     Date(Visit_Date) < '01/01/2012'      
 GROUP BY
     p.name, p.address, p.city, p.Pat_Number, v.Pat_Number
 HAVING SUM(v.price) > 1000
 ORDER BY 
     total DESC;

1
查询语句中WHERE部分的条件适用于每一行,您不能在此处使用聚合函数。对于分组,有一个类似的功能称为HAVINGHAVING类似于WHERE,但条件是针对每个组应用的。因此,将HAVING sum(v.price) > 1000添加到查询中,将仅过滤总价超过1000的那些组。

0
通常我们在使用group by时会用到having子句。尝试这样做:
 SELECT p.name, p.address, p.city, sum(v.price) as total
 FROM VISIT v join PATIENT p on  p.Pat_Number = v.Pat_Number
 where Date(Visit_Date)<'01/01/2012'      
 group by p.name, p.address, p.city, p.Pat_Number, v.Pat_Number
 having sum(v.price) > 1000
order by total DESC;

如果这对你有用,请告诉我。


0
尝试使用“having”子句来检查“sum(v.price)>1000”,因为这里的“sum”是在“group by”子句上的聚合函数。因此,在比较“sum(v.price)”时,应该使用“having”子句。请使用以下SQL命令:
SELECT p.name, p.address, p.city, sum(v.price) as total
 FROM VISIT v join PATIENT p on  p.Pat_Number = v.Pat_Number
 where Date(Visit_Date)<'01/01/2012'      
 group by p.name, p.address, p.city, p.Pat_Number, v.Pat_Number
 having sum(v.price) > 1000
 order by total DESC;

如果您想了解更多关于having子句的信息,请访问w3schools.com并查看SQL部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接