不是GROUP BY表达式

时间:2012-01-12 12:31:10

标签: sql oracle group-by

我跟随选择:

Select attribut1, dateattribut, attribut3, 
       attribut4, attribut15, town_CODE, count(*)     
from (
select attribut1, dateattribut, attribut3, attribut4, attribut15, (CASE 
  WHEN  TO_CHAR(dateattribut,'YYYY')  = '2005'  THEN 
   CASE town_CODE 
    WHEN '039' THEN  '078' WHEN '050' THEN  '093' 
    WHEN '091' THEN  '008' WHEN '102' THEN  '093' 
   ELSE town_CODE end 
  ELSE town_CODE end) as town_CODE
from towntable) GROUP BY attribut1, dateattribut, 
                        attribut3, attribut4, 
                        attribut15, town_CODE
having count(*) > 1;

当我在我们的服务器上执行此查询时,它工作正常。但是在我客户的服务器上,我得到了oracle错误ORA-00979: not a GROUP BY expression

到目前为止,我发现我遇到了Case和别名的问题。 没有这个它有效。

有什么建议吗?

*我正在尝试用这个陈述来获得所有双重输入。使用内部查询我将所有旧代码更改为新代码,然后我想将它们分组以查看它们是否存在多次。 有些客户确实使用过旧代码,现在可能有两次相同的城镇。

修改

SELECT * FROM product_component_version

我得到了两个:

Product                                     Version         Status

NLSRTL                                      10.2.0.4.0      Production
Oracle Database 10g Enterprise Edition      10.2.0.4.0      64bi
PL/SQL                                      10.2.0.4.0      Production
TNS for 64-bit Windows:                     10.2.0.4.0      Production

EDIT2

我的测试告诉我他不喜欢用别名打电话。 是否有设置,别名无法识别?

4 个答案:

答案 0 :(得分:3)

  

“当我在我们的服务器上执行此查询时,它工作正常。但是在   我客户的服务器我得到了oracle错误ORA-00979: not a GROUP BY expression.

这意味着以下两件事之一:

  1. 您的服务器与客户的服务器不同,这种差异可以防止出错;例如,您的服务器是更高版本或具有不同的补丁级别。
  2. 您实际上并不是在自己运行时在客户的数据库上运行相同的代码。
  3. 后者似乎很有可能,因为您在此处发布的代码显然不是您在自己的服务器上运行的代码。正如其他人所指出的那样,它包含了几个语法错误,但事实上它们都不会抛出ORA-00979。

    该错误意味着您在投影中有一个不在GROUP BY子句中的非聚合列,或者您在GROUP BY子句中有一些不在投影中的内容。

答案 1 :(得分:1)

您在表格名称后面缺少括号,在attribut15之后缺少逗号。试试这个:

Select attribut1, dateattribut, attribut3, 
       attribut4, attribut15, town_CODE, count(*)     
from (
select attribut1, dateattribut, attribut3, attribut4, attribut15, (CASE 
  WHEN  TO_CHAR(dateattribut,'YYYY')  = '2005'  THEN 
   CASE town_CODE 
    WHEN '039' THEN  '078' WHEN '050' THEN  '093' 
    WHEN '091' THEN  '008' WHEN '102' THEN  '093' 
   ELSE town_CODE end 
  ELSE town_CODE end) as town_CODE
from towntable) GROUP BY attribut1, dateattribut, 
                        attribut3, attribut4, 
                        attribut15, town_CODE
having count(*) > 1;

答案 2 :(得分:0)

原始查询中似乎存在一个或两个语法错误 - 以下内容应该有效:

Select attribut1, 
       dateattribut, 
       attribut3, 
       attribut4, 
       attribut15, 
       town_CODE, 
       count(*)     
from (select attribut1, 
             dateattribut, 
             attribut3, 
             attribut4, 
             attribut15,
             CASE WHEN TO_CHAR(dateattribut,'YYYY') = '2005' THEN 
                  CASE town_CODE 
                       WHEN '039' THEN  '078' 
                       WHEN '050' THEN  '093' 
                       WHEN '091' THEN  '008' 
                       WHEN '102' THEN  '093' 
                       ELSE town_CODE
                  end 
                  ELSE town_CODE
             end as town_CODE
      from towntable) v 
GROUP BY attribut1, 
         dateattribut, 
         attribut3, 
         attribut4, 
         attribut15, 
         town_CODE
having count(*) > 1

答案 3 :(得分:0)

我的解决方案是使用View。

内部选择视图,然后外部选择正常,它工作正常。

我发现他不喜欢外部选择中的town_CODE。

Select attribut1, dateattribut, attribut3,
       attribut4, attribut15, town_CODE, count(*)     
from  v_towntable
GROUP BY attribut1, dateattribut, attribut3, 
         attribut4, attribut15, town_CODE
having count(*) > 1