안녕하세요 MYSQL 쿼리 질문 드립니다. 0 5 588

by 윤 [SQL Query] [2022.02.22 11:31:22]



WITH TAB AS (
SELECT 1 AS A_IDX, 1 AS B_IDX, 1 AS SN, 3 AS CO FROM DUAL UNION ALL
SELECT 1 AS A_IDX, 1 AS B_IDX, 2 AS SN, 3 AS CO FROM DUAL UNION ALL
SELECT 1 AS A_IDX, 2 AS B_IDX, 1 AS SN, 10 AS CO FROM DUAL
),
TAB_IDX as (
SELECT 1 AS A_IDX FROM DUAL
)
select 
(select SUM(A.CO) from (select MIN(CO) as CO from TAB where A_IDX = A.IDX group by B_IDX)A) as SU
from TAB_IDX A
WITH TAB AS (
SELECT 1 AS A_IDX, 1 AS B_IDX, 1 AS SN, 3 AS CO FROM DUAL UNION ALL
SELECT 1 AS A_IDX, 1 AS B_IDX, 2 AS SN, 3 AS CO FROM DUAL UNION ALL
SELECT 1 AS A_IDX, 2 AS B_IDX, 1 AS SN, 10 AS CO FROM DUAL
),
TAB_IDX AS (
SELECT 1 AS A_IDX FROM DUAL
)
SELECT 
(SELECT SUM(A.CO) FROM (SELECT MIN(CO) AS CO FROM TAB WHERE A_IDX = A.IDX GROUP BY B_IDX)A) AS SU
FROM TAB_IDX A;

해당 쿼리를 셀렉트절에 서브로 노출 사용할 생각인데...

 B_IDX 그룹핑 된 기준으로 CO 점수를 합산해서 노출시키고 싶습니다.

SUM = 13값을 노출시키려면 어떻게 해야할지 여쭤봅니다.

현재는 16이 나오고 있습니다.

by 마농 [2022.02.22 13:09:36]

1. b_idx 가 같으면 co 도 같은가요?
- 예시엔 같은 값만 있는데?
- 다를 수도 있는지?
2. co 는 문자인가요? 숫자인가요?
- 예시엔 따옴표가 붙어 있는 문자인데?
- 따옴표가 없는 숫자이어야 하지 않나요?
- 다른 항목들도 다 숫자 같은데? 따옴표 없어야 하지 않나요?
3. MySQL 맞나요?
- FROM dual 은 오라클 인데요?
4. 서브쿼리를 사용하지 않으려는 건가요?
- 왜? 그래야 하죠?


by 윤 [2022.02.22 13:20:34]

1.b_idx가 같으면 CO도 동일값입니다 ! 다른값은 존재하지 않습니다. 해당 idx중복값에는 TAB_IDX.SN값만 다르게 구성되어있습니다. sn의 값이 하나라도 존재하면 그룹핑 하고싶어서요!

2.아 죄송합니다 말씀주신사항이 맞습니다. idx값이라 전부 숫자형입니다 !추후에 co의 sum()값을 최종 도출하고자 합니다 ! 더미 데이터 변경했습니다.

3. mariaDB 사용중이며, 기존테이블들의 사용될 함축된 데이터만 끌어서 더미테이블로 만들어봤습니다.마리아db와 mysql 사용문이 비슷하다고 하여 이렇게 적었습니다..ㅎ

4. 전체적인 구조를 바꾸지 않고, 기존 쿼리 구조를 바꾸지 않은상태에서 변경하고자 했습니다..ㅜ

 


by 마농 [2022.02.22 13:30:00]

sn 은 어떤 항목인가요?
순번 같은데? 1 이 항상 존재한다면? 이를 이용하면 간단할 것 같은데요?
WHERE sn = 1

-- sn = 1 조건을 이용하는 방안 --
WITH tab AS
(
SELECT 1 a_idx, 1 b_idx, 1 sn, 3 co
UNION ALL SELECT 1, 1, 2,  3
UNION ALL SELECT 1, 2, 1, 10
)
, tab_idx AS
(
SELECT 1 a_idx
)
SELECT a.a_idx
     , SUM(b.co) co
  FROM tab_idx a
 INNER JOIN tab b
    ON a.a_idx = b.a_idx
 WHERE b.sn = 1
 GROUP BY a.a_idx
;
-- sn = 1 조건을 이용할 수 없다면 --
WITH tab AS
(
SELECT 1 a_idx, 1 b_idx, 1 sn, 3 co
UNION ALL SELECT 1, 1, 2,  3
UNION ALL SELECT 1, 2, 1, 10
)
, tab_idx AS
(
SELECT 1 a_idx
)
SELECT a_idx
     , SUM(co) co
  FROM (SELECT DISTINCT
               b.a_idx
             , b.b_idx
             , b.co
          FROM tab_idx a
         INNER JOIN tab b
            ON a.a_idx = b.a_idx
        ) c
 GROUP BY a_idx
;

 


by 마농 [2022.02.22 14:21:41]
WITH tab AS
(
SELECT 1 a_idx, 1 b_idx, 1 sn, 3 co
UNION ALL SELECT 1, 1, 2,  3
UNION ALL SELECT 1, 2, 1, 10
)
, tab_idx AS
(
SELECT 1 a_idx
)
-- 스칼라서브쿼리로 풀고 싶을 때 --
SELECT a.a_idx
     , (-- 1. sn = 1 인 행이 항상 1개가 존재한다고 가정하면 --
        SELECT SUM(co)
          FROM tab
         WHERE a_idx = a.a_idx
           AND sn = 1
        ) co_1
     , (-- 2. b_idx 가 다르면 co 도 다르다 라고 가정하면 --
        SELECT SUM(DISTINCT co)
          FROM tab
         WHERE a_idx = a.a_idx
        ) co_2
     , (-- 3. 1,2번 상황을 가정할 수 없다면 --
        SELECT SUM(b.co)
          FROM tab b
          LEFT OUTER JOIN tab c
            ON b.a_idx = c.a_idx
           AND b.b_idx = c.b_idx
           AND b.sn    > c.sn
         WHERE b.a_idx = a.a_idx
           AND c.a_idx IS NULL
        ) co_3
  FROM tab_idx a
;

 


by 윤 [2022.02.22 15:05:54]

스칼라서브쿼리로 풀려는데, 여러가지 방안으로 풀어주셔서 감사합니다. !!

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