WITH TMP AS (
SELECT 'A1' CD , 100 AMT FROM DUAL UNION ALL
SELECT 'A2' CD , -200 AMT FROM DUAL UNION ALL
SELECT 'A3' CD , -100 AMT FROM DUAL
)
위와 같은 TMP 테이블이 있습니다.
원하는 결과는 0 보다 작은 코드와 금액인데 하나의 로우만 보여져야 합니다.
꼭 최소 금액일 필요는 없지만 (A3 , -100 을 구해도 되지만) 가급적 최소 금액을 구해보려 합니다.
세가지 쿼리를 작성하여 보았는데
[3번-쿼리]는 0보다 작은 임의의 값을 구하는거라 왠지 좀 꺼려지네요..
여튼. 어떻게 하던지
VIEW로 묶지 않고는 안되네요.....
VIEW로 묶지 않고 하는 방법은 없는건가요?
더 좋은 방법이 있는지 궁금합니다.
/* [1번-쿼리] ROW_NUMBER() 를 이용 하여 A2 , -200 을 구함. */
WITH TMP AS (
SELECT 'A1' CD , 100 AMT FROM DUAL UNION ALL
SELECT 'A2' CD , -200 AMT FROM DUAL UNION ALL
SELECT 'A3' CD , -100 AMT FROM DUAL
)
SELECT *
FROM (
SELECT CD , MIN(AMT)
, ROW_NUMBER() OVER(ORDER BY MIN(AMT)) AS RN
FROM TMP
WHERE 1 = 1
GROUP BY CD
)
WHERE 1 = 1
AND RN = 1
/* [2번-쿼리] ORDER BY를 이용 하여 A2 , -200을 구함. */
WITH TMP AS (
SELECT 'A1' CD , 100 AMT FROM DUAL UNION ALL
SELECT 'A2' CD , -200 AMT FROM DUAL UNION ALL
SELECT 'A3' CD , -100 AMT FROM DUAL
)
SELECT *
FROM (
SELECT CD , MIN(AMT)
FROM TMP
WHERE 1 = 1
GROUP BY CD
ORDER BY MIN(AMT)
)
WHERE 1 = 1
AND ROWNUM = 1
/* [3번-쿼리] HAVING을 이용 하여 0 보다 작은 임의의 로우를 구함. */
WITH TMP AS (
SELECT 'A1' CD , 100 AMT FROM DUAL UNION ALL
SELECT 'A2' CD , -200 AMT FROM DUAL UNION ALL
SELECT 'A3' CD , -100 AMT FROM DUAL
)
SELECT *
FROM (
SELECT CD , MIN(AMT)
FROM TMP
WHERE 1 = 1
GROUP BY CD
HAVING MIN(AMT) < 0
)
WHERE 1 = 1
AND ROWNUM = 1
|