找出这段代码的问题(WITH C AS ( SELECT COUNT( * ) AA FROM wjj_yy_yldsj_gxysfjl A, wjj_yy_yldsj_grjkdaxx B WHERE A.HEALTH_ID = B.HEALTH_ID AND B.STATUS = '0' AND A.VISITS_DATE >= DATE_FORMAT( SYSDATE(), '%Y-%m-%d' ) ), D AS ( SELECT COUNT( * ) AA FROM wjj_yy_yldsj_gxysfjl A, wjj_yy_yldsj_grjkdaxx B WHERE A.HEALTH_ID = B.HEALTH_ID AND B.STATUS = '0' AND A.VISITS_DATE BETWEEN DATE_FORMAT(DATE_FORMAT( SYSDATE(), '%Y-%m-%d' ) - 1, '%Y-%m-%d' ) AND DATE_FORMAT(SYSDATE(), '%Y-%m-%d' ) ) SELECT ROUND((C.AA - D.AA )/D.AA,2)*100||'%' FROM C.AA,B.AA )
时间: 2024-02-27 18:58:00 浏览: 74
此段代码中存在以下问题:
1. 在 WITH 子句中定义的 C 和 D 是两个不同的子查询,但在最终的 SELECT 语句中只引用了 C.AA,缺少 D.AA 的引用。
2. 在最终的 SELECT 语句中使用了 || 连接符来连接计算结果和百分号,这是 Oracle 数据库中的写法,但在 MySQL 中应该使用 CONCAT 函数来连接字符串。
3. 子查询中使用了日期格式转换函数 DATE_FORMAT,但是这会导致查询性能下降,建议将日期格式转换提前到程序中,而不是在 SQL 查询中进行。
下面是修正后的代码(假设你想计算今天和昨天的数量差异百分比):
```
SELECT ROUND((C.AA - D.AA) / D.AA * 100, 2) AS percentage
FROM (
SELECT COUNT(*) AS AA
FROM wjj_yy_yldsj_gxysfjl A
JOIN wjj_yy_yldsj_grjkdaxx B ON A.HEALTH_ID = B.HEALTH_ID
WHERE B.STATUS = '0'
AND A.VISITS_DATE >= DATE(NOW())
) C, (
SELECT COUNT(*) AS AA
FROM wjj_yy_yldsj_gxysfjl A
JOIN wjj_yy_yldsj_grjkdaxx B ON A.HEALTH_ID = B.HEALTH_ID
WHERE B.STATUS = '0'
AND A.VISITS_DATE BETWEEN DATE(NOW() - INTERVAL 1 DAY) AND DATE(NOW())
) D;
```
阅读全文