안녕하세요 . mysql에서 한행씩 더해서 값을 계산하고 싶습니다. 0 10 677

by 마르스헤븐 [MySQL] [2021.03.17 15:48:19]


안녕하세요 답변 주셔서 너무 감사합니다.  버전은 5.6.25 이고요. 저번에 가르쳐 주셔서 잘해결하였는데 또 모르는것이 있어 다시 질문드립니다. 아래의 식처럼 쿼리를 짜야하는데 도무지 어떻게 해야할지 영 모르겠습니다. 가르침을 주시면  정말 감사하겠습니다. 

A B C D
2019/2/18 6 B2 C2/COUNT(1)
2019/2/19 16 B2+B3 C3/COUNT(2)
2019/2/20 18 B2+B3+B4 C4/COUNT(3)
2019/2/21 12 B2+B3+B4+B5 C5/COUNT(4)
2019/2/22 9 B2+B3+B4+B5+B6 C6/COUNT(5)
2019/2/23 8 B2+B3+B4+B5+B6+B7 C7/COUNT(6)
2019/2/24 3 B2+B3+B4+B5+B6+B7+B8 C8/COUNT(7)
2019/2/25 4 B9 C9/COUNT(1)
2019/2/26 6 B9+B10 C10/COUNT(2)
2019/2/27 2 B9+B10+B11 C11/COUNT(3)
2019/2/28 5 B9+B10+B11+B12 C12/COUNT(4)
2019/3/1 5 B9+B10+B11+B12+B13 C13/COUNT(5)
2019/3/2 2 B9+B10+B11+B12+B13+B14 C14/COUNT(6)
2019/3/3 2 B9+B10+B11+B12+B13+B14+B15 C15/COUNT(7)
by 마농 [2021.03.17 16:01:34]

중간에 새로 시작하는 이유가?


by 마르스헤븐 [2021.03.17 16:17:49]

중간에 새로 시작하는 이유가 주가 바겨서 그렇습니다.

 

A B C D e
2019-02-18 6 B2 C2/COUNT(1) 1주
2019-02-19 16 B2+B3 C3/COUNT(2) 1주
2019-02-20 18 B2+B3+B4 C4/COUNT(3) 1주
2019-02-21 12 B2+B3+B4+B5 C5/COUNT(4) 1주
2019-02-22 9 B2+B3+B4+B5+B6 C6/COUNT(5) 1주
2019-02-23 8 B2+B3+B4+B5+B6+B7 C7/COUNT(6) 1주
2019-02-24 3 B2+B3+B4+B5+B6+B7+B8 C8/COUNT(7) 1주
2019-02-25 4 B9 C9/COUNT(1) 2주
2019-02-26 6 B9+B10 C10/COUNT(2) 2주
2019-02-27 2 B9+B10+B11 C11/COUNT(3) 2주
2019-02-28 5 B9+B10+B11+B12 C12/COUNT(4) 2주
2019-03-01 5 B9+B10+B11+B12+B13 C13/COUNT(5) 2주
2019-03-02 2 B9+B10+B11+B12+B13+B14 C14/COUNT(6) 2주
2019-03-03 2 B9+B10+B11+B12+B13+B14+B15 C15/COUNT(7) 2주

by 마농 [2021.03.17 16:19:32]

주차 정보 컬럼이 따로 있는 건가요?


by 마르스헤븐 [2021.03.17 16:22:57]

네 따로 있습니다. 


by 마농 [2021.03.17 16:52:54]
WITH t AS
(
SELECT '2019-02-18' dt, 1 w, 6 v
UNION ALL SELECT '2019-02-19', 1, 16
UNION ALL SELECT '2019-02-20', 1, 18
UNION ALL SELECT '2019-02-21', 1, 12
UNION ALL SELECT '2019-02-22', 1,  9
UNION ALL SELECT '2019-02-23', 1,  8
UNION ALL SELECT '2019-02-24', 1,  3
UNION ALL SELECT '2019-02-25', 2,  4
UNION ALL SELECT '2019-02-26', 2,  6
UNION ALL SELECT '2019-02-27', 2,  2
UNION ALL SELECT '2019-02-28', 2,  5
UNION ALL SELECT '2019-03-01', 2,  5
UNION ALL SELECT '2019-03-02', 2,  2
UNION ALL SELECT '2019-03-03', 2,  2
)
SELECT dt
     , w
     , v
     , @cnt := IF(@w = w, @cnt + 1, 1) v_cnt
     , @sum := IF(@w = w, @sum + v, v) v_sum
     , ROUND(@sum / @cnt, 2)           v_avg
     , @w := w
  FROM t
     , (SELECT @w := 0, @sum := 0, @cnt := 0) a
 ORDER BY dt
;

 


by 마르스헤븐 [2021.03.17 16:59:12]

마농님 정말 감사합니다. 분석후 제것으로 만들도록 노력하겠습니다.


by 마농 [2021.03.17 17:07:52]

질문을 좀 추상적으로 하는 경향이 있는데요.
추상적 표현 보다는 구체적 표현 을 해주세요
아무 의미 없는 a, b 보다는 일자(dt), 값(val)등의 의미있는 표현
b2+b3/COUNT(2) 라고 계산식만 적기 보다는
(b2+b3)/COUNT(2) = (6+16)/2 = 11 처럼 실질적인 예를 들어 주세요.
COUNT(2) 라는 표현의 의미를 파악하지 못해 한참을 고민했습니다.
주차 정보와 같은 중요한 정보를 빼고 질문하지 말아 주세요.


by 마르스헤븐 [2021.03.17 17:21:37]

네 다음부터 구체적으로 적도록 하겠습니다.  흑시 B열에 값이 0 이 들어가있으면 D에서 나누기를 할때

제외하고 하는 방법은 있을까요?

 

날짜(a) 폐사(b) 폐사 합(c) 평균(d) 주차(e)
2019-02-18 0 B2         = (0) 0이 포함시 제외 1주
2019-02-19 0 B2+B3    = (0) 0이 포함시 제외 1주
2019-02-20 18 B2+B3+B4 =  (18) (18/ 1) 1주
2019-02-21 12 B2+B3+B4+B5 = (30) (30/ 2) 1주
2019-02-22 9 B2+B3+B4+B5+B6 = (39) (39 / 3) 1주
2019-02-23 8 B2+B3+B4+B5+B6+B7 = (47) (47/ 4) 1주
2019-02-24 3 B2+B3+B4+B5+B6+B7+B8 = (50) (50 / 5) 1주
2019-02-25 4 B9 C9/COUNT(1) 2주
2019-02-26 6 B9+B10 C10/COUNT(2) 2주
2019-02-27 2 B9+B10+B11 C11/COUNT(3) 2주
2019-02-28 5 B9+B10+B11+B12 C12/COUNT(4) 2주
2019-03-01 5 B9+B10+B11+B12+B13 C13/COUNT(5) 2주
2019-03-02 2 B9+B10+B11+B12+B13+B14 C14/COUNT(6) 2주
2019-03-03 2 B9+B10+B11+B12+B13+B14+B15 C15/COUNT(7) 2주

 


by 마농 [2021.03.17 17:47:13]
WITH t AS
(
SELECT '2019-02-18' dt, 0 v, 1 w
UNION ALL SELECT '2019-02-19',  0, 1
UNION ALL SELECT '2019-02-20', 18, 1
UNION ALL SELECT '2019-02-21', 12, 1
UNION ALL SELECT '2019-02-22',  9, 1
UNION ALL SELECT '2019-02-23',  8, 1
UNION ALL SELECT '2019-02-24',  3, 1
UNION ALL SELECT '2019-02-25',  4, 2
UNION ALL SELECT '2019-02-26',  6, 2
UNION ALL SELECT '2019-02-27',  2, 2
UNION ALL SELECT '2019-02-28',  5, 2
UNION ALL SELECT '2019-03-01',  5, 2
UNION ALL SELECT '2019-03-02',  2, 2
UNION ALL SELECT '2019-03-03',  2, 2
)
SELECT dt
     , v
     , @cnt := IF(@w = w, @cnt, 0) + SIGN(v) v_cnt
     , @sum := IF(@w = w, @sum, 0) + v       v_sum
     , ROUND(@sum / @cnt, 2)                 v_avg
     , @w := w w
  FROM t
     , (SELECT @w := 0, @sum := 0, @cnt := 0) a
 ORDER BY dt
;

 


by 마르스헤븐 [2021.03.17 17:54:26]

정말 감사합니다. 마농님 덕분에 정말 많이 배웁니다. 너무 감사드립니다. 조금있다가 저녁도 맛있게 드십시요

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