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

时间:2015-04-11 18:01:21

标签: sql postgresql

我使用Postgresql 9.4解决了这个问题,我需要程序只显示sum(v.price) > 1000,但是如果我把total > 1000放在条件告诉我的情况下,那就是{not}&t存在并且不允许我放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 个答案:

答案 0 :(得分:3)

Having sum(v.price) > 1000之后添加group by

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 :(得分:1)

查询的WHERE部分中的条件适用于每一行。你不能在那里使用聚合函数。对于名为HAVING的组,有类似的功能。 HAVINGWHERE类似,但每个组都应用条件。因此,向查询添加HAVING sum(v.price) > 1000将仅过滤那些价格总和高于1000的组。

答案 2 :(得分:0)

我们通常使用一个有子句的组。试试这个:

 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;

请告诉我这是否适合您。

答案 3 :(得分:0)

尝试使用条款来检查总和(v.price)&gt; 1000。因为这里sum是group by子句的聚合函数。所以为了比较&#34; sum(v.price)&#34;,你应该使用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部分。