2 SELECT * 3 FROM IPLAT4J.TMMICSALJ01 T01 4 WHERE PROD_UNIT in ( ' 1LJ ' , ' 3LJ ' , ' 4LJ ' ) and PROD_DATE BETWEEN ' 20220306 ' AND ' 20220306 ' 5 order by PROD_UNIT), 6 TEMP2 AS ( 7 SELECT * , CASE WHEN PROD_UNIT = ' 1LJ ' THEN nvl(ACT_COST, 0 ) ELSE 0 8 end as ACT_COST1, CASE WHEN PROD_UNIT = ' 3LJ ' THEN nvl(ACT_COST, 0 ) ELSE 0 9 end as ACT_COST3, CASE WHEN PROD_UNIT = ' 4LJ ' THEN nvl(ACT_COST, 0 ) ELSE 0 10 end as ACT_COST4 11 FROM TEMP1 ), 12 TEMP3 AS ( 13 SELECT * , CASE WHEN PROD_UNIT = ' 1LJ ' THEN nvl(ACT_CONSUME_DH, 0 ) ELSE 0 14 end as ACT_CONSUME_DH1, CASE WHEN PROD_UNIT = ' 3LJ ' THEN nvl(ACT_CONSUME_DH, 0 ) ELSE 0 15 end as ACT_CONSUME_DH3, CASE WHEN PROD_UNIT = ' 4LJ ' THEN nvl(ACT_CONSUME_DH, 0 ) ELSE 0 16 end as ACT_CONSUME_DH4 17 FROM TEMP2 ) 18 SELECT MAT_CODE, MAX (TYPE1_NAME) AS TYPE1_NAME, MAX (TYPE2_NAME) AS TYPE2_NAME, MAX (TYPE3_NAME) AS TYPE3_NAME, MAX (COST_SUBJECT_NAME) AS COST_SUBJECT_NAME, 19 MAX (ACT_COST1) AS ACT_COST1, MAX (ACT_COST3) AS ACT_COST3, MAX (ACT_COST4) AS ACT_COST4, MAX (ACT_CONSUME_DH1) AS ACT_CONSUME_DH1, 20 MAX (ACT_CONSUME_DH3) AS ACT_CONSUME_DH3, MAX (ACT_CONSUME_DH4) AS ACT_CONSUME_DH4 21 FROM TEMP3 GROUP BY MAT_CODE

执行sql后的结果想把为null的行去掉

于是乎,我就在group by 后加上了HAVING COUNT(TYPE3_NAME)>0,然后问题就解决了

HAVING COUNT(目标字段) 是对group by分组后的数据再过滤的方法。