在oracle中使用having和group by子句时出错

时间:2011-07-08 05:02:03

标签: sql oracle

hHis是我的桌子假人:

OUTPUT  OQTY    INPUT   IQTY    EN      FLEX
Y3      1       X       2       Y       0
Y4      1       X       2       Y       0
Y5      1       X       2       N       0
Y6      1       X       2       N       0
Y1      1       X       2       Y       0
Y2      1       X       2       Y       0

我的疑问是:

SELECT INPUT,count(*)
FROM dummy
GROUP BY INPUT
HAVING EN = 'Y';

我收到的错误不是分组声明。

我想用en = Y来计算类似的输入。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

您不需要在这里使用having,通常用于检查只能在分组完成后计算的条件(如having count(*) > 2或类似内容)。< / p>

使用类似:

select    input,
          count(*) as quantity
from      dummy
where     en = 'Y'
group by  input

无法使用having en = 'Y'的原因是因为您已经加载了所有行并在having子句开始之前对它们进行了分组。换句话说,您不再拥有 en列信息,它已在汇总中丢失。


见下面的成绩单:

>  DROP TABLE DUMMY%
>  CREATE TABLE DUMMY (OUTPUT CHAR(2), OQTY INTEGER,
>>    INPUT CHAR(1), IQTY INTEGER, EN CHAR(2), FLEX INTEGER)%
>  INSERT INTO DUMMY (OUTPUT, OQTY, INPUT, IQTY, EN, FLEX) VALUES
>>    ('Y3',1,'X',2,'Y',0), ('Y4',1,'X',2,'Y',0), ('Y5',1,'X',2,'N',0), 
>>    ('Y6',1,'X',2,'N',0), ('Y1',1,'X',2,'Y',0), ('Y2',1,'X',2,'Y',0)%

>  SELECT * FROM DUMMY ORDER BY EN, INPUT, OUTPUT%
   OUTPUT  OQTY  INPUT  IQTY  EN  FLEX
   ------  ----  -----  ----  --  ----
   Y5         1  X         2  N      0
   Y6         1  X         2  N      0
   Y1         1  X         2  Y      0
   Y2         1  X         2  Y      0
   Y3         1  X         2  Y      0
   Y4         1  X         2  Y      0

>  SELECT      INPUT, COUNT(*) AS QUANT
>>    FROM     DUMMY
>>    WHERE    EN = 'Y'
>>    GROUP BY INPUT%
   INPUT  QUANT
   -----  -----
   X          4

并且,更新其中一个相关行:

>  UPDATE DUMMY SET INPUT = 'Z' WHERE OUTPUT = 'Y1'%   
>  SELECT * FROM DUMMY ORDER BY EN, INPUT, OUTPUT%
   OUTPUT  OQTY  INPUT  IQTY  EN  FLEX
   ------  ----  -----  ----  --  ----
   Y5         1  X         2  N      0
   Y6         1  X         2  N      0
   Y2         1  X         2  Y      0
   Y3         1  X         2  Y      0
   Y4         1  X         2  Y      0
   Y1         1  Z         2  Y      0

>  SELECT      INPUT, COUNT(*) AS QUANT
>>    FROM     DUMMY
>>    WHERE    EN = 'Y'
>>    GROUP BY INPUT%
   INPUT  QUANT
   -----  -----
   X          3
   Z          1

答案 1 :(得分:0)

而不是Count(*),定义要计算的列名。

检查以下

SELECT INPUT,count(EN) As TotalEnCount
FROM [dummy]
where EN = 'Y'
GROUP BY INPUT