A表如下: 
   JH            DBJH1       LTCH1  LTLB1   DBJH2       LTCH2    LTLB2   ..... DBJH8  LTCH8 LTLB8
QKFLiUjDyG 7qY170vJba 21 G 1b6XwlKMTx 21 G
QKFLiUjDyG 7qY170vJba 22 G 1b6XwlKMTx 22 G
QKFLiUjDyG 7qY170vJba 3 G 1b6XwlKMTx 3 G
QKFLiUjDyG 7qY170vJba 41 G 1b6XwlKMTx N
QKFLiUjDyG 7qY170vJba 0 1b6XwlKMTx N
QKFLiUjDyG 7qY170vJba 42 G 1b6XwlKMTx 42 G
B8hhWM7oP5 faUZLi3ccf 0 BgHyOtaWUn 21 G
B8hhWM7oP5 faUZLi3ccf 0 BgHyOtaWUn 0
B8hhWM7oP5 faUZLi3ccf N BgHyOtaWUn 41*1 G
B8hhWM7oP5 faUZLi3ccf 0 BgHyOtaWUn 42 G
B8hhWM7oP5 faUZLi3ccf 0 BgHyOtaWUn 43
上表中按JH和DBJH1、DBJH2、DBJH3......DBJH8 分组 。
对于JH字段中的每种元素例如“QKFLiUjDyG”的8个DBJH列(DBJH1、DBJH2、DBJH3......DBJH8) 进行求COUNT操作。以DBJH1列为例,我现在的做法如下:
1、对LTCH1列求Count 。条件:所有非0和非‘N’的记录
(select JH,DBJH1,count(LTCH1) LTCH1_CNT from A where LTCH1 <> '0' AND LTCH1 <> 'N') p12、对LTLB1列求Count 。条件:内容为‘G’的记录
(select JH,DBJH1,count(LTLB1) LTLB1_CNT from A where LTLB1 = 'G') p2   3、将上面2个子查询关联。如果LTCH1_CNT > 0 AND LTCH1_CNT <> LTLB1_CNT,则DBJH1的内容为空
select p1.jh,
case when ltch1_cnt > 0 and ltch1_cnt<>ltlb1_cnt then p1.dbjh1 else '' end dbjh1
from p1 left join p2 where p1.jh = p2.jh 问题是现在有8个DBJH列都需要做上面的判断。
如果按照我上面的方法,就需要将8个JBJH的子查询在全部关联起来,SQL非常麻烦。
请教大家有没有别的好方法呢?

解决方案 »

  1.   

    不好意思,上面表中列的位置在发贴时错乱了。重新发一次表,方便大家。
    JH            DBJH1      LTCH1    LTLB1    DBJH2     LTCH2     LTLB2 ........
    QKFLiUjDyG 7qY170vJba 21 G 1b6XwlKMTx 21 G
    QKFLiUjDyG 7qY170vJba 22 1b6XwlKMTx 22 G
    QKFLiUjDyG 7qY170vJba N 1b6XwlKMTx 3 G
    QKFLiUjDyG 7qY170vJba 41 G 1b6XwlKMTx N
    QKFLiUjDyG 7qY170vJba 0 1b6XwlKMTx N
    QKFLiUjDyG 7qY170vJba 42 G 1b6XwlKMTx 42 G
    B8hhWM7oP5 faUZLi3ccf 0 BgHyOtaWUn 21
    B8hhWM7oP5 faUZLi3ccf 0 BgHyOtaWUn 0
    B8hhWM7oP5 faUZLi3ccf N BgHyOtaWUn 41*1 G
    B8hhWM7oP5 faUZLi3ccf 0 BgHyOtaWUn 42
    B8hhWM7oP5 faUZLi3ccf 0 BgHyOtaWUn 43
      

  2.   

    太长了,眼睛犯困。要不你写个程序来生成这个sql?
      

  3.   

    SELECT JH,
           CASE WHEN SUM(DECODE(LTCH1,'0',0,'N',0,1)) > 0 AND SUM(DECODE(LTLB1,'G',1,0))-SUM(DECODE(LTCH1,'0',0,'N',0,1)) <>0 THEN DBJH1 ELSE NULL END DBJH1
    FROM   A
    GROUP BY JH;
      

  4.   

    全都是按JH和DBJH1、DBJH2、DBJH3......DBJH8 分组?
    还是分别按jh,dbjh1/jh,dbjh2/jh,dbjh3。分组
      

  5.   

    全部按JH和DBJH1、DBJH2、DBJH3......DBJH8分组。
    结果查询的结构如下:DBJH列不为空的,就是判断中满足条件的。为空的就是判断中不满足条件的。
     JH               DBJH1        DBJH2        DBJH3 ..........
    QKFLiUjDyG      7qY170vJba                 1b6XwlKMTx  
    B8hhWM7oP5                     BgHyOtaWUn
      

  6.   

    SELECT JH,
           CASE WHEN SUM(DECODE(LTCH1,'0',0,'N',0,1)) > 0 AND SUM(DECODE(LTLB1,'G',1,0))-SUM(DECODE(LTCH1,'0',0,'N',0,1)) <>0 THEN MAX(DBJH1) ELSE NULL END DBJH1,
           CASE WHEN SUM(DECODE(LTCH2,'0',0,'N',0,1)) > 0 AND SUM(DECODE(LTLB2,'G',1,0))-SUM(DECODE(LTCH1,'0',0,'N',0,1)) <>0 THEN MAX(DBJH1) ELSE NULL END DBJH2,
        ...
    FROM   A
    GROUP BY JH;我的不能用?
      

  7.   

    group by 后面要加上DBJH1,DBJH2,DBJH3...DBJH8
      

  8.   

    细节上好像没弄清楚..
    SELECT JH, 
          CASE WHEN SUM(DECODE(LTCH1,'0',0,'N',0,1)) > 0 AND SUM(DECODE(LTLB1,'G',1,0))-SUM(DECODE(LTCH1,'0',0,'N',0,1)) <>0 THEN DBJH1 ELSE NULL END DBJH1, 
          CASE WHEN SUM(DECODE(LTCH2,'0',0,'N',0,1)) > 0 AND SUM(DECODE(LTLB2,'G',1,0))-SUM(DECODE(LTCH2,'0',0,'N',0,1)) <>0 THEN DBJH2 ELSE NULL END DBJH2, 
        ... 
    FROM  A 
    GROUP BY JH,DBJH1,DBJH2,DBJH3...DBJH8;