为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:linux
【CPU】:
【问题描述】*:调了很久的这个mysql语句 都没成功 该怎么调
SELECT A.date_time as datetime,COALESCE ( B.num, 0 ) AS num,B.title FROM( SELECT DATE_FORMAT( date_add( '2020-01-01', INTERVAL ROW YEAR ), '%Y' ) date_time FROM ( SELECT @row := @row + 1 as row FROM (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t, (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2, (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3, (select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4, (SELECT @row:=-1) r ) se WHERE DATE_FORMAT( date_add( '2020-01-01', INTERVAL ROW YEAR ), '%Y' ) <= DATE_FORMAT( '2024-12-01', '%Y' )) A LEFT JOIN ( SELECT DATE_FORMAT( PC_FSTIME, '%Y' ) AS date_time,b.PC_RANK AS title,COUNT( 1 ) AS num FROM qms_deviation_description a,qms_deviation_evaluation_classification b WHERE a.id=b.P_ID and b.PC_RANK IS NOT NULL GROUP BY date_time,b.PC_RANK ) B ON A.date_time = B.date_time
1)要注意关键的问题,row是关键字,可以统一改成 row_
2)主要是 SELECT @row...@row:=-1) r ) se 这部分的改写,可以考虑统一换成如下内容,看看哪种是你需要的。
第一种:
with a as(select level-1 from dual connect by level<=10)
select rownum row_,* from a a,a b,a c,a d
第二种:
select level row_ from dual connect by level<=10000
SELECT
A.date_time AS datetime,
COALESCE(B.num, 0) AS num,
B.title
FROM (
SELECT
TO_CHAR(ADD_MONTHS(DATE '2020-01-01', (row_num - 1) * 12), 'YYYY') AS date_time
FROM (
SELECT LEVEL AS row_num
FROM DUAL
CONNECT BY LEVEL <= 5
) t
) A
LEFT JOIN (
SELECT
TO_CHAR(PC_FSTIME, 'YYYY') AS date_time,
b.PC_RANK AS title,
COUNT(1) AS num
FROM qms_deviation_description a
JOIN qms_deviation_evaluation_classification b ON a.id = b.P_ID
WHERE b.PC_RANK IS NOT NULL
GROUP BY TO_CHAR(PC_FSTIME, 'YYYY'), b.PC_RANK
) B ON A.date_time = B.date_time;
根据你原逻辑同等改写
SELECT A.date_time as datetime,
COALESCE ( B.num, 0 ) AS num,
B.title
FROM(
SELECT DATE_FORMAT(dateadd(year, (rownum - 1), '2020-01-01'), '%Y' ) date_time
connect by rownum<=1e4
and DATE_FORMAT(dateadd(year, (rownum - 1), '2020-01-01'), '%Y' ) <= DATE_FORMAT((date'2024-12-01'), '%Y')
) A
LEFT JOIN ( SELECT DATE_FORMAT( PC_FSTIME, '%Y' ) AS date_time,
b.PC_RANK AS title,
COUNT( 1 ) AS num
FROM qms_deviation_description a,
qms_deviation_evaluation_classification b
WHERE a.id=b.P_ID
and b.PC_RANK IS NOT NULL
GROUP BY date_time,
b.PC_RANK ) B
ON A.date_time = B.date_time
把表结构粘贴出来,如果能一点测试数据更好,不然不好调试改写。