| 분류 | M Name | Target | |||
| SU | G | L | H | ||
| total | total | 24 | 13 | 23 | 28 |
| Food | sub-total | 9 | 6 | 13 | 12 |
| Food | Food-Healthy A | 5 | 3 | 6 | 10 |
| Food | Food-Healthy B | 4 | 3 | 7 | 2 |
| Beauty | sub-total | 15 | 7 | 10 | 16 |
| Beauty | Hair | 7 | 3 | 7 | 11 |
| Beauty | Body | 8 | 4 | 3 | 5 |
안녕하세요, 그루비 통해서 하나씩 하나씩 쿼리를 배워나가고 있는 유저 입니다..
쿼리를 짜다보니 상기와 같은 테이블에서 조건을 다이나믹 하게 줘여할 경우가 생겨 문의 드려봅니다.
상기 테이블에서 파라미터로 분류와, M Name 그리고 SU/G/L/H 중에 한 값까지 총 3개의 파라미텉를 전달 받아 쿼리를 수행하여 각각
상세 데이터를 조회 하려고 합니다.
Select * FROM 테이블 WHERE 분류 = {파람1} AND M_NAME = {파람2} AND TARGET = {파람3} 식의 쿼리가 될텐데요...
그런데 중간에 Total, Sub-Total은 화면에 보여주기 위해서 집계를 낸 것이기 때문에
Select * FROM 테이블 WHERE 분류 = {파람1} AND TARGET = {파람3} 형태의 쿼리가 되어야 합니다.
중간에 AND M_NAME = {파람2} 조건이 없는 쿼리문으로 수행 되어야 하는데요.
어떤식으로 쿼리를 작성해야 하는지 조언 부탁 드립니다.
단 1개의 SQL문으로 3가지의 케이스를 커버 할 수 있어야 합니다.
3가지 케이스는 - 파람1 이 Total 인 경우,
- 파람2가 Sub-Total 인 경우
- 그외(파람 1, 파람2가 Total, Sub-Total이 아닌 경우)
조건을 빼는 것이 아니라 해당 total / sub_total 값을 조회하지 못하도록 만드는게 맞지 않을까 싶은데요.
Select * FROM 테이블 WHERE 분류 = {파람1} AND M_NAME = {파람2} AND TARGET = {파람3}
and M_NAME not in ('total','sub-total')
로 설정하는 것이 맞아 보입니다.
... 그나저나 [TARGET = {파람3}] 이 부분의 조건식은 어떻게 처리될지 궁금하네요
제가 설명이 부족했네요... 3가지 케이스를 1개의 SQL문으로 작성 되어야 하는데.. 명시적으로 not in으로 해버리면 커버가 안되는 케이스가 발생 합니다 ㅠㅠ
뭔가 설명이 이상합니다.
파람1,2,3 으로 3개로 들어오는 것 맞나요?
파람 하나에 3가지 조회구분이 들어가야 하는게 아닐런지?
target 은 또 뭔가요? 올려주신 테이블에는 안보이는데요?
질문을 정확하게 정리해 주셔야 합니다.
3가지 케이스별 조회결과 예를 들어 주세요.
원본 대비 조회조건에 따른 각각의 케이스별 결과표
제가 설명이 부족했나 보네요..
부연 설명 드리면, 우선 표에서 Target 부분 추가 하였고, 표의 정보는 데이터가 아닌 파라미터로 넘어 갈 수 있는 매트릭스에 더 가까운것 같습니다.
파라미터 는 총3개가 들어오게 되고, 3 가지 파라미터로 조회되는 원본 상세데이터가 조회 되어야 합니다.
Select * FROM 테이블 WHERE 분류 = {파람1} AND M_NAME = {파람2} AND TARGET = {파람3} 쿼리를 수행
- 데이터 원본 상세
| 분류 | M Name | M ID | Target | Target ID | Prod ID | IDX |
| Food | Food-Healthy A | 1000 | SU | 1 | 101 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 102 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 103 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 104 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 301 | 100 |
| Food | Food-Healthy B | 1100 | SU | 1 | 302 | 100 |
| Food | Food-Healthy B | 1100 | SU | 1 | 105 | 100 |
| Food | Food-Healthy B | 1100 | SU | 1 | 106 | 100 |
| Food | Food-Healthy B | 1100 | SU | 1 | 107 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 108 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 109 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 110 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 111 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 112 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 113 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 114 | 100 |
| Beauty | Body | 1300 | SU | 1 | 115 | 100 |
| Beauty | Body | 1300 | SU | 1 | 116 | 100 |
| Beauty | Body | 1300 | SU | 1 | 117 | 100 |
| Beauty | Body | 1300 | SU | 1 | 118 | 100 |
| Beauty | Body | 1300 | SU | 1 | 119 | 100 |
| Beauty | Body | 1300 | SU | 1 | 120 | 100 |
| Beauty | Body | 1300 | SU | 1 | 121 | 100 |
| Beauty | Body | 1300 | SU | 1 | 122 | 100 |
- 조회 케이스 1 :
예를 들면 Food / Healthy A / SU에 교차되는 5를 클릭 하게 되면 Food / Healthy A / SU 정보가 파라미터로 넘어가게 되고
| 분류 | M Name | M ID | Target | Target ID | Prod ID | IDX |
| Food | Food-Healthy A | 1000 | SU | 1 | 101 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 102 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 103 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 104 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 301 | 100 |
- 조회 케이스 2:
여기서 문제는 Total / Total / SU 에 해당하는 24를 클릭하게 되면 파라미터 Total / Total은 상기 테이블 내에 존재 하지 않는 데이터 이고 합계를 의미이고
Select * FROM 테이블 WHERE TARGET = {파람3} 형태로 쿼리가 수행 되어야 합니다. (샘플을 Target이 SU인 경우만 예를 들어 원본 상세 데이터 목록과 동일 합니다. )
| 분류 | M Name | M ID | Target | Target ID | Prod ID | IDX |
| Food | Food-Healthy A | 1000 | SU | 1 | 101 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 102 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 103 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 104 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 301 | 100 |
| Food | Food-Healthy B | 1100 | SU | 1 | 302 | 100 |
| Food | Food-Healthy B | 1100 | SU | 1 | 105 | 100 |
| Food | Food-Healthy B | 1100 | SU | 1 | 106 | 100 |
| Food | Food-Healthy B | 1100 | SU | 1 | 107 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 108 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 109 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 110 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 111 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 112 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 113 | 100 |
| Beauty | Hair | 1200 | SU | 1 | 114 | 100 |
| Beauty | Body | 1300 | SU | 1 | 115 | 100 |
| Beauty | Body | 1300 | SU | 1 | 116 | 100 |
| Beauty | Body | 1300 | SU | 1 | 117 | 100 |
| Beauty | Body | 1300 | SU | 1 | 118 | 100 |
| Beauty | Body | 1300 | SU | 1 | 119 | 100 |
| Beauty | Body | 1300 | SU | 1 | 120 | 100 |
| Beauty | Body | 1300 | SU | 1 | 121 | 100 |
| Beauty | Body | 1300 | SU | 1 | 122 | 100 |
- 조회 케이스 3:
Food / Sub-Total / SU에 해당하는 9를 클릭시에도 동일하게 합계를 의미하는 데이터 이고 Select * FROM 테이블 WHERE 분류 = {파람1} AND TARGET = {파람3} 의 형태로 쿼리가 수행되어 합니다.
| 분류 | M Name | M ID | Target | Target ID | Prod ID | IDX |
| Food | Food-Healthy A | 1000 | SU | 1 | 101 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 102 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 103 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 104 | 100 |
| Food | Food-Healthy A | 1000 | SU | 1 | 301 | 100 |
| Food | Food-Healthy B | 1000 | SU | 1 | 302 | 100 |
| Food | Food-Healthy B | 1000 | SU | 1 | 105 | 100 |
| Food | Food-Healthy B | 1000 | SU | 1 | 106 | 100 |
| Food | Food-Healthy B | 1000 | SU | 1 | 107 | 100 |
위에 세가지 쿼리 케이스는 커버 할 수 있는 단일 쿼리를 작성해야 하는데. 어떤식으로 작성해야 할지 문의 드립니다.
SELECT *
FROM t
WHERE :p_1 IN ('total', 분류)
AND :p_2 IN ('total', 'sub-total', M_Name)
AND :p_3 = target
;