한 테이블 에서 셀프 조인 해서
어제 날에서 데이터와 오늘 데이터를 비교 하려는 쿼리를 짜려고 하는데요
1 2 3 4 5 6 7 8 9 10 11 12 | select p_yest.point as ` open `, p_today.point as ` close `, ((p_today.point - p_yest.point)/p_yest.point) as `change` from math p_today inner join math p_yest on p_today.seq = p_yest.seq and p_today.reg_date = DATE_ADD(p_yest.reg_date, interval -1 day ) where p_today.point >0 and date (p_today.reg_date)= '2021-10-12' limit 100 |
reg_date data type 은 datetime(3)으로 되어 있으며
값은 2021-10-12 22:38:07.817000000 이렇게 들어 있습니다
날짜를 하루 더해서 비교 하고 싶은데
쿼리를 날리면 결과값이 하나도 없네요 날자 인터벌을 0으로 하면 당연히 나오고...
뭐가 잘못된걸까요?
seq는 index 번호입니다
select p_yest.point as `open`, p_today.point as `close`, ((p_today.point - p_yest.point)/p_yest.point) as `change` from math p_today inner join math p_yest on p_today.seq = p_yest.seq where p_today.point >0 and date(p_today.reg_date)='2021-10-12' limit 100
날짜 비교 를 삭제 하면 다음과 같은 값이 나옵니다
seq | open | close | change
1 30 30 0.0
2 50 50 0.0
3 70 70 0.0
4 60 60 0.0
close 값이 다음날 값이 나와야 하는데 동일한 날이 비교가 되어 나옵니다
혹시 원하는 것이
레코드들끼리 조인한 결과가 아닌
일자별 합계 값이 필요한 건 아닌지?
1 2 3 4 5 6 7 8 9 10 11 | SELECT yest , today , today / yest - 1 change FROM ( SELECT SUM ( CASE WHEN reg_date < '2021-10-12' THEN point END ) yest , SUM ( CASE WHEN reg_date >= '2021-10-12' THEN point END ) today FROM math WHERE point > 0 AND reg_date >= '2021-10-12' - INTERVAL 1 DAY AND reg_date < '2021-10-12' + INTERVAL 1 DAY ) a ; |
1 2 3 4 5 6 7 8 | seq | reg_date | point | name 1 2021-10-12 22:38:08.817000000 30 철수 2 2021-10-12 22:38:08.817000000 50 미나 3 2021-10-13 22:38:08.817000000 50 철수 4 2021-10-13 22:38:08.817000000 50 미나 시분초는 모두 다릅니다 |
바쁘신데도 계속 댓글 남겨주셔서 감사합니다.
제가 원하는 데이터는 철수와 미나의 어제 오늘 값 비교 였는데 제가 빠트려서 올려 더 귀찮게 해드린거 같네요
어제 오늘의 철수 미나의 수학점수의 점수 차이를 퍼센트로 출력하는 쿼리를짜고 싶었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | WITH math AS ( SELECT 1 seq, CAST ( '2021-10-12 22:38:08.817' AS DATETIME(3)) reg_date, 30 point, '철수' name UNION ALL SELECT 2, CAST ( '2021-10-12 22:38:08.817' AS DATETIME(3)), 50, '미나' UNION ALL SELECT 3, CAST ( '2021-10-13 22:38:08.817' AS DATETIME(3)), 50, '철수' UNION ALL SELECT 4, CAST ( '2021-10-13 22:38:08.817' AS DATETIME(3)), 50, '미나' UNION ALL SELECT 5, CAST ( '2021-10-12 22:38:08.817' AS DATETIME(3)), 50, '마농' UNION ALL SELECT 6, CAST ( '2021-10-13 22:38:08.817' AS DATETIME(3)), 40, '마농' ) SELECT name , yest , today , ROUND(today / yest - 1, 3) changes FROM ( SELECT name , SUM ( CASE WHEN reg_date < '2021-10-13' THEN point END ) yest , SUM ( CASE WHEN reg_date >= '2021-10-13' THEN point END ) today FROM math WHERE 1=1 AND reg_date >= '2021-10-13' - INTERVAL 1 DAY AND reg_date < '2021-10-13' + INTERVAL 1 DAY GROUP BY name ) a ; |