오늘 하루 종일 검색을 해도 도통 이해가 되지 않아. 고수님들의 조언을 구하고자 문의 드립니다.
test 라는 테이블에
p_idx, p_q1, p_q2, p_q3, p_q4, p_q5
1 5 3 2 4 5
결과값
max = 5
min = 2
컬럼이 있으며, 해당 컬럼중 max 값과 min 값을 추출 하고자
쿼리를 짜고 있는데.. 이해도가 낮아 감이 안오내요..
고수님들 조언좀 부탁드립니다.
살려주십쇼.ㅠㅠ
Comment 4
-
건우아빠
2019.06.18 22:14
-
지혁유주
2019.06.19 09:58
너무 감사합니다. 건우아빠님
육아로 힘드실텐데. 조언 주셔서 너무 감사해요^^
-
루디먼트
2019.07.16 23:00
select values를 이용하면 쉽게 처리할 수 잇을 듯 하네요. -
루디먼트
2019.07.16 23:17
;with cteTest (idx, c1, c2, c3, c4, c5) as (select 1, 5, 3, 2, 4, 5 union allselect 2, 5, 11, 4, 7, 9)select idx, cMin, cMaxfrom cteTest as across apply (select min(col) as cMin, max(col) as cMaxfrom (values (c1), (c2), (c3), (c4), (c5)) as x (col)) as bgo
여러 방법이 있을듯 합니다.
3번째가 무식한듯 하지만 성능이 좋을듯..
------------------------------------------------------------------------------
;with res as
(
select 1 p_idx, 5 p_q1, 3 p_q2, 2 p_q3, 4 p_q4, 5 p_q5
)
select p_idx , max(pval) max_val , min(pval) min_val
from res
UNPIVOT
(
pval FOR [col] IN (p_q1,p_q2,p_q3,p_q4,p_q5)
) as p
group by p_idx
------------------------------------------------------------------------------
;
;with res as
(
select 1 p_idx, 5 p_q1, 3 p_q2, 2 p_q3, 4 p_q4, 5 p_q5
) ,
result as
(
select p_idx , convert(varchar,p_q1)+'/'+ convert(varchar,p_q2)+'/'+ convert(varchar,p_q3)+'/'+ convert(varchar,p_q4)+'/'+ convert(varchar,p_q5) VALS
from res
)
SELECT A.p_idx
, max(CAST(SUBSTRING(A.VALS,B.S,B.E-B.S) AS INT)) max_val
, min(CAST(SUBSTRING(A.VALS,B.S,B.E-B.S) AS INT)) min_val
FROM result A
CROSS APPLY (
SELECT TOP (2047) NUMBER S
, CHARINDEX('/',A.VALS+'/',NUMBER + 1) E
FROM MASTER.DBO.SPT_VALUES
WHERE NUMBER = CHARINDEX ('/','/'+A.VALS,NUMBER)
AND TYPE ='P'
ORDER BY NUMBER) B
GROUP BY A.p_idx
------------------------------------------------------------------------------
;with res as
(
select 1 p_idx, 5 p_q1, 3 p_q2, 2 p_q3, 4 p_q4, 5 p_q5
)
select p_idx
, case when p_q1 < p_q2 then
case when p_q2 < p_q3 then
case when p_q3 < p_q4 then
case when p_q4 < p_q5 then
p_q5
else p_q4 end
else p_q3 end
else p_q2 end
else p_q1 end max_val
, case when p_q1 > p_q2 then
case when p_q2 > p_q3 then
case when p_q3 > p_q4 then
case when p_q4 > p_q5 then
p_q5
else p_q4 end
else p_q3 end
else p_q2 end
else p_q1 end min_val
from res