一个必须注意的地方是:SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是聚合函数列。 
----------------------------------- 
select a.NEW_RO_SO_CASE,
'' as testcol,
count(*) 
from vedvr_master a,ve_issue_letter b,ve_letter_dvr c where a.dvr_id = c.dvr_id and c.letter_id = b.letter_id 
group by a.NEW_RO_SO_CASE,b.LETTER_TYPE_CODE  运行没问题 而 select PARENT_DVR_ID, 
(select ENG_DESC from VE_DEFECT_GROUP where DEFECT_GROUP_CODE = a.DEFECT_GROUP_CODE1) as DEFECT_GROUP_DESC, 
count(*) 
from vedvr_master a group by PARENT_DVR_ID,DEFECT_GROUP_DESC 
------------------ 却有问题呢? 
 我的疑问是: 
第一句:b.LETTER_TYPE_CODE没有出现在select的列表中,却能运行。同时,testcol可有可无 一样能运行 
第二句:DEFECT_GROUP_DESC出现在select列表中 为什么又运行不了? 
我想是不是一定是出现在from的tables的列表中才对啊?

解决方案 »

  1.   

    group by后面不能使用本查询语句中新赋的字段别名
      

  2.   

    b.LETTER_TYPE_CODE不一定要出现在结果中
    ''是一个常量所以不需要聚合
      

  3.   

    第一句:b.LETTER_TYPE_CODE没有出现在select的列表中,却能运行。同时,testcol可有可无 一样能运行
    -------
    只要求select的列要出现在group by子句中,没说group by的列一定要出现在select中。
    testcol是‘’,是一个常量,不是表中的列,无需聚合。
    第二句:DEFECT_GROUP_DESC出现在select列表中 为什么又运行不了? 
    --------
    group by后面不能使用前面的字段别名,你的DEFECT_GROUP_DESC是别名。
      

  4.   

    1、group by后面之所以必须跟上select后面的字段
       1)group by顾名思义分组,把很多条数据分成一组,也就是说返回的结果是"一条"
       2)如果select a,b,count(*) from table_name group by a;
         假设出现如下数据
              1  2
             1  3
         a 返回值是分组后的1,b呢? 是返回2 还是返回3,数据库"傻了",因此必须
             select a,b,count(*) from table_name group by a,b;
       3)即使在2)的举例中 b中的数据是完全相同的。
          如:
              1  2
             1  2
         select a,b,count(*) from table_name group by a;
         也是不可以的,因为虽然对于你,b是相同的这件事是"显而易见的",但是对于数据库它是"不知道的",
          必须显示的告诉他。
        4)对于常量情况就不同了,相当于你显示的告诉了数据库,b字段的值是一样的,因此常量不在
          group by 后面出现也是可以的。2、sql的解析顺序是
    from → where → group by → having → select → order by
    因为 select 在 group by 后面被解析,因此在 select 中起的别名在 group by里面不会被识别。※以上观点属于个人理解,如有不对的地方还请高手指正。
      

  5.   

    group by 后面不能使用本查询语句中新赋的字段别名
      

  6.   

    第一句:b.LETTER_TYPE_CODE没有出现在select的列表中,却能运行。同时,testcol可有可无 一样能运行 
    --b.LETTER_TYPE_CODE没有出现在select的列表中,也是可在Group by 中,这样分组更细,testCol是常量不是字段,所以没有关系第二句:DEFECT_GROUP_DESC出现在select列表中 为什么又运行不了? 
    --DEFECT_GROUP_DESC是一个子查询,再嵌套一层就可以运行