어제 와 오늘 비교 쿼리 질문입니다 0 11 928

by harus4 [MySQL] [2022.01.19 10:56:55]


한 테이블 에서 셀프 조인 해서 

어제 날에서 데이터와 오늘 데이터를 비교 하려는 쿼리를 짜려고 하는데요


 


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 값이 다음날 값이 나와야 하는데 동일한 날이 비교가 되어 나옵니다

by 마농 [2022.01.19 11:12:06]

1. 일단 올리신 쿼리가 문법이 이상한데요?
- 컴마도 안맞고 알리아스도 이상하고, 계산식도 이상하고
- 문법에 맞는 쿼리로 질문해 주셔야 할 것 같네요.
2. seq 항목으로 조인하는데
- seq 가 어떤 값인가요? 조인키가 맞는지?


by harus4 [2022.01.19 11:20:53]

seq는 인덱스 번호이고 계산식이 이상하게 올라가서 다시 올렸습니다.

확인해주셔서 감사합니다.


by 마농 [2022.01.19 11:26:48]

seq 가 조인키가 맞는지? 의문입니다.
샘플 데이터를 볼 수 있을까요?
원본 대비 결과표


by 마농 [2022.01.19 11:31:17]

원본 질문에 있던 date 함수가 수정 질문에서는 사라졌네요?
date 함수가 필요해 보입니다.


by 마농 [2022.01.19 12:34:37]

조인 없이 그냥 조회했을 때의 원본 자료를 보여주세요.
포인트만 보여주지 마시고 조인키가 될만한 다른 항목도 보여주세요.
seq 는 조인키가 아닌 것으로 보입니다.


by 마농 [2022.01.19 14:36:41]

혹시 원하는 것이
레코드들끼리 조인한 결과가 아닌
일자별 합계 값이 필요한 건 아닌지?
 

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
;

 


by harus4 [2022.01.19 14:46:20]
seq | reg_date | point

1    2021-10-12 22:38:08    30
2    2021-10-12 22:38:08    50
3    2021-10-13 22:38:08    50
4    2021-10-13 22:38:08    50

 

이게 기본 데이터 입니다

 


by 마농 [2022.01.19 14:57:09]

기본 데이터 대비 원하는 결과는 어떻게 되나요?
원본 데이터는 위 예시처럼 시분초가 동일한가요?


by harus4 [2022.01.19 15:02:56]
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 미나

시분초는 모두 다릅니다

 

바쁘신데도 계속 댓글 남겨주셔서 감사합니다.

 

제가 원하는 데이터는  철수와 미나의 어제 오늘 값 비교 였는데 제가 빠트려서 올려 더 귀찮게 해드린거 같네요

어제 오늘의 철수 미나의 수학점수의 점수 차이를 퍼센트로 출력하는 쿼리를짜고 싶었습니다.

 


by 마농 [2022.01.19 15:19:46]
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
;

 


by harus4 [2022.01.19 18:13:38]

감사합니다 알려주신 내용 토대로 조금 변경 하여 진행해보도록 하겠습니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입