SELECT 쿼리 질문 0 7 505

by 아이티메시 [MySQL] [2019.03.18 10:00:31]


다음과 같은 테이블이 있을때, 
groupSeq가 180번인 회원중에 250번이 없는 회원 수를 구하려면 쿼리를 어떻게 만들어야 할까요?

1

2

3

4

5

6

|memberSeq|groupSeq|

|1|180|

|1|250|

|2|180|

|3|180|

|3|250|

by 우리집아찌 [2019.03.18 10:07:24]

groupSeq는 3자리로 되어있나요?

 

SELECT A.memberSeq 
     , A.groupSeq
  FROM T A
     , (SELECT AA.memberSeq
          FROM ( SELECT memberSeq 
                      , GROUP_CONCAT(groupSeq) AS txt_groupSeq
                    FROM T
                   GROUP BY memberSeq
                ) AA
         WHERE AA.txt_groupSeq LIKE '%|180|%'
           AND AA.txt_groupSeq NOT LIKE '%|250|%'
       ) B
 WHERE A.memberSeq = B.memberSeq

 


by 아이티메시 [2019.03.18 10:16:07]

네 3자리입니다


by 우리집아찌 [2019.03.18 10:20:57]

구분자가 존재해서 구분자까지 포함했습니다.


by inbeater [2019.03.18 10:16:42]

groupSeq가 180이면 당연히 250을 포함하지 않는게 되지 않나요???

 

멤버별로 250을 포함하지 않는걸 찾는건지... 질문 의도를 모르겠어요... 더 정확히 조건을 알려주시겠어요?


by 아이티메시 [2019.03.18 11:08:21]

groupSeq가 180 하나만 있는 회원, groupSeq가 180도 있고 250도 있는 회원이 있습니다.

회원별로 groupSeq가 180이 있는 회원중에 250번이 없는 회원의 수를 구하는 쿼리입니다.

 


by 신이만든지기 [2019.03.18 11:34:37]
WITH
    T AS
        (SELECT 1 MEMSEQ, 180 GROUPSEQ FROM DUAL
         UNION ALL
         SELECT 1 MEMSEQ, 250 GROUPSEQ FROM DUAL
         UNION ALL
         SELECT 2 MEMSEQ, 180 GROUPSEQ FROM DUAL
         UNION ALL
         SELECT 3 MEMSEQ, 180 GROUPSEQ FROM DUAL
         UNION ALL
         SELECT 3 MEMSEQ, 250 GROUPSEQ FROM DUAL)
SELECT *
  FROM (
           SELECT MEMSEQ, GROUPSEQ, COUNT(*) OVER (PARTITION BY MEMSEQ) CNT
             FROM T
            WHERE GROUPSEQ IN (180, 250)
       )
 WHERE CNT = 1 AND GROUPSEQ = 180;

 


by 마농 [2019.03.18 13:15:33]
WITH t AS
(
SELECT 1 memberSeq, 180 groupSeq
UNION ALL SELECT 1, 250
UNION ALL SELECT 2, 180
UNION ALL SELECT 3, 180
UNION ALL SELECT 3, 250
)
-- 1. Group By & Having
SELECT COUNT(*)
  FROM (SELECT memberSeq
          FROM t
         WHERE groupSeq IN (180, 250)
         GROUP BY memberSeq
        HAVING COUNT(CASE WHEN groupSeq = 250 THEN 1 END) = 0
        ) a
;
-- 2. Not In
SELECT COUNT(*)
  FROM t a
 WHERE a.groupSeq = 180
   AND a.memberSeq NOT IN (SELECT b.memberSeq
                             FROM t b
                            WHERE b.groupSeq = 250
                           )
;
-- 3. Not Exists
SELECT COUNT(*)
  FROM t a
 WHERE a.groupSeq = 180
   AND NOT EXISTS (SELECT 1
                     FROM t b
                    WHERE b.memberSeq = a.memberSeq
                      AND b.groupSeq  = 250
                   )
;
-- 4. Outer Join & Is Null
SELECT COUNT(*)
  FROM t a
  LEFT OUTER JOIN t b
    ON b.memberSeq = a.memberSeq
   AND b.groupSeq  = 250
 WHERE a.groupSeq  = 180
   AND b.groupSeq IS NULL
;

 

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