永洪社区

标题: 求个SQL语句,感谢。 [打印本页]

作者: yhdata_zfYQk03B    时间: 2022-2-17 14:38
标题: 求个SQL语句,感谢。
黄颜色4列是想通过SQL计算出来的。
逻辑:
判断:IF(当前指令的状态出现S和G,"未开工",if(当前指令的状态出现B和C,"未完成","已完成"   
计算当前指令下B、C状态个数   
计算当前指令下A、D状态个数   
计算当前指令下除B、C、A、D状态以外状态的个数  
作者: 美滋滋    时间: 2022-2-17 14:38
再给你一个写法供参考。
SELECT
        A.test1,
        A.test2,
  CASE WHEN B.SGCNT > 0 THEN '未开工'
                 ELSE CASE WHEN B.BCCNT > 0 THEN '未完成'
                                             ELSE '已完成' END
  END AS "状态" ,
  B.BCCNT AS 'BC个数',
  B.ADCNT AS 'AD个数',
  B.NOT_ABCDCNT AS 'ABCD以外个数'
FROM test A
LEFT JOIN (
select test1,
sum(case when test2 in ('S','G') then 1 ELSE 0 END) AS SGCNT,
sum(case when test2 IN ('B','C') then 1 ELSE 0 END) AS BCCNT,
sum(case when test2 IN ('A','D') then 1 ELSE 0 END) AS ADCNT,
sum(case when test2 not IN ('A','B','C','D') then 1 ELSE 0 END) AS NOT_ABCDCNT
FROM test
group by test1
) B
ON A.test1 = B.test1
作者: yhdata_zfYQk03B    时间: 2022-2-17 14:39
数据如图片。
作者: 永洪tech-Bella    时间: 2022-2-17 14:43
yhdata_zfYQk03B 发表于 2022-2-17 14:39
数据如图片。

稍等,咱们先看下
作者: 永洪tech-Bella    时间: 2022-2-17 17:29
永洪tech-Bella 发表于 2022-2-17 14:43
稍等,咱们先看下

这个逻辑跟咱们上一个帖子类似,还是按照之前类似的逻辑写就可以,要完整的sql的话,建议是联系数据库dba
https://club.yonghongtech.com/thread-17850-1-1.html
作者: yhdata_zfYQk03B    时间: 2022-2-18 15:42
实是写不出来,烦请帮忙看。
作者: 美滋滋    时间: 2022-2-18 15:56
1.你的图片不是很清晰。
2.你描述的需求不是很详细,我没有太看明白。
【判断:IF(当前指令的状态出现S和G,"未开工",if(当前指令的状态出现B和C,"未完成","已完成" 】  
  就是这句话,我没有完全理解。
作者: 美滋滋    时间: 2022-2-18 16:21
SELECT
        A.test1,
        A.test2,
CASE WHEN IFNULL(B.cnt,0) > 0 THEN '未开工'
                 else case when IFNULL(C.cnt,0) > 0 THEN '未完成'
                                             else '已完成' end
END AS "状态" ,
  IFNULL(C.cnt,0) AS 'BC个数',
  IFNULL(D.cnt,0) AS 'AD个数',
  IFNULL(E.cnt,0) AS 'ABCD以外个数'
FROM
        test A
        LEFT JOIN ( SELECT test1, count( 1 ) cnt FROM test WHERE test2 IN ( 'S', 'G' ) GROUP BY test1 ) B ON A.test1 = B.test1
        LEFT JOIN ( SELECT test1, count( 1 ) cnt FROM test WHERE test2 IN ( 'B', 'C' ) GROUP BY test1 ) C ON A.test1 = C.test1
        LEFT JOIN ( SELECT test1, count( 1 ) cnt FROM test WHERE test2 IN ( 'A', 'D' ) GROUP BY test1 ) D ON A.test1 = D.test1
        LEFT JOIN ( SELECT test1, count( 1 ) cnt FROM test WHERE test2 NOT IN ( 'A','B','C','D' ) GROUP BY test1 ) E ON A.test1 = E.test1
(, 下载次数: 121)