<문제>
* 테이블명 : order_regular_delivery_schdule
* 칼럼명 : meal
* meal 칼럼의 예시 레코드는 아래와 같습니다.
[{"set_cnt":1,"set_meal":[{"day_of_week":"thu","pid":"0000010010","pname":"애호박죽","pimg":"https://foodcare-cle.com/data/mall_data/images/product/00/00/01/00/10/m_0000010010.gif?1676538858","al_matter":[""],"is_care":false,"qty":1,"group":"2023-02-2343010_10","start_group":true,"end_group":false,"max_qty":"1"}]},{"set_cnt":1,"set_meal":[{"day_of_week":"wed","pid":"0000010014","pname":"현미죽","pimg":"https://foodcare-cle.com/data/mall_data/images/product/00/00/01/00/14/m_0000010014.gif?1676538858","al_matter":[""],"is_care":false,"qty":1,"group":"2023-03-0134110_10","start_group":true,"end_group":false,"max_qty":"1"}]}]
* 제가 작성한 쿼리 : SELECT JSON_EXTRACT(d.meal, '$[*].set_cnt') FROM order_regular_delivery_schdule AS d
* 이에 대한 결괏값으로는 예를 들어,
첫번째 행(위에 예시로 올려드린 레코드) 에는 [1,1]
두번째 행에는 [1]
세번째 행에는 [1,2,1] 이런식으로 반환됩니다.
<원하는 점>
저는 여기서 [1]이나 [1,1] 그리고 [1,2,1] 같은 리스트의 리스트 내 요소들의 합계를 구하는 쿼리를 작성하고 싶은데,
여기서 SELECT SUM(JSON_EXTRACT(d.meal, '$[*].set_cnt')) FROM order_regular_delivery_schdule AS d
이런식으로 SUM()함수를 사용하면
각 행별로 리스트의 합계가 추출되지 않고,
모든 행을 합해버린뒤 하나의 행으로만 결괏값이 도출됩니다.
<질문>
1. 제가 원하는 대로 각 행별로 합계를 구하는 방법이 있을까요?
2. 그리고 각 행별로 요소들의 개수를 count 하는 방법이 있을까요?
sql 쿼리 초보라 많은 도움 주시면 감사하겠습니다.
1. 그룹바이 하면 됩니다.
2. JSON_LENGTH
3. 사용하신 SUM 방식으로는 원하는 결과가 나오지 않을 듯 합니다. -> 개별로 쪼갠 후에 SUM 해야 할 듯.
WITH order_regular_delivery_schdule AS
(
SELECT 1 idx, '[{"set_cnt":1,"set_meal":[{"day_of_week":"thu","pid":"0000010010","pname":"애호박죽","pimg":"https://foodcare-cle.com/data/mall_data/images/product/00/00/01/00/10/m_0000010010.gif?1676538858","al_matter":[""],"is_care":false,"qty":1,"group":"2023-02-2343010_10","start_group":true,"end_group":false,"max_qty":"1"}]},{"set_cnt":1,"set_meal":[{"day_of_week":"wed","pid":"0000010014","pname":"현미죽","pimg":"https://foodcare-cle.com/data/mall_data/images/product/00/00/01/00/14/m_0000010014.gif?1676538858","al_matter":[""],"is_care":false,"qty":1,"group":"2023-03-0134110_10","start_group":true,"end_group":false,"max_qty":"1"}]}]' meal
UNION ALL SELECT 2, '[{"set_cnt":1,"set_meal":[{"day_of_week":"thu","pid":"0000010010","pname":"애호박죽","pimg":"https://foodcare-cle.com/data/mall_data/images/product/00/00/01/00/10/m_0000010010.gif?1676538858","al_matter":[""],"is_care":false,"qty":1,"group":"2023-02-2343010_10","start_group":true,"end_group":false,"max_qty":"1"}]}]'
)
, copy_t AS
(
SELECT 0 lv
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
)
SELECT idx
, JSON_EXTRACT(d.meal, '$[*].set_cnt') set_cnt
, SUM(JSON_EXTRACT(d.meal, CONCAT('$[', lv, '].set_cnt'))) set_cnt_sum
FROM order_regular_delivery_schdule d
INNER JOIN copy_t c
ON c.lv < JSON_LENGTH(d.meal)
GROUP BY idx
, JSON_EXTRACT(d.meal, '$[*].set_cnt')
;