2009-12-04 2 views
1

일부 기준을 만족하는 "첫 번째"행에서 열 값을 추출하려고합니다. "첫 번째"는 하드 코드 된 목록으로 정의됩니다 열 값의 불행히도 저는 SQL 아마추어입니다. DB2를 사용하고 있습니다.하드 코딩 된 열 값 목록에서 첫 번째 행 찾기 (피벗 문제?)

나는이 같은 비효율적으로 그것을 할 수 있습니다 :

SELECT COALESCE(
    (SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2" AND COL = 'A'), 
    (SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2" AND COL = 'B'), 
    (SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2" AND COL = 'C'), 
    (SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2" AND COL = 'D') 
) 

문제는 여기에 SOMETABLE가 매우 큰 것입니다. 그래서 대신 다음과 같이하고 싶습니다 :

SELECT COALESCE(
    (SELECT COL FROM T WHERE COL = 'A'), 
    (SELECT COL FROM T WHERE COL = 'B'), 
    (SELECT COL FROM T WHERE COL = 'C'), 
    (SELECT COL FROM T WHERE COL = 'D') 
) 
FROM 
    (SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2") AS T 

T 테이블을 참조 할 수 없기 때문에 이것은 유효하지 않습니다.

는 T 위의 다음 행이 포함되어 있다고 가정 :

'E' 
'B' 
'D' 

는 COALESCE 문에 지정된 첫 번째 값이기 때문에 그 때 나는, 'B'를 선택하고 싶습니다.

이제
- - - - 
- - - D 
- B - - 

I 집계 또는이 점을 "결합"하고 싶은 :이 결과를 얻을 수

SELECT 
    (CASE COL WHEN 'A' THEN COL ELSE NULL END), 
    (CASE COL WHEN 'B' THEN COL ELSE NULL END), 
    (CASE COL WHEN 'C' THEN COL ELSE NULL END), 
    (CASE COL WHEN 'D' THEN COL ELSE NULL END) 
FROM 
    (SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2") AS T 

:

나는 내가 좋아하는 일을함으로써 어느 정도 가까이 내가 원하는 것을 얻을 수 있습니다 실현 다음과 같은 단일 행 :

- B - D 

그런 다음 간단히 열을 결합합니다.

의견을 보내 주시면 대단히 감사하겠습니다.

답변

0

해결책을 찾은 것 같습니다.

SELECT COALESCE(
    MAX(CASE COL WHEN 'A' THEN COL ELSE NULL END), 
    MAX(CASE COL WHEN 'B' THEN COL ELSE NULL END), 
    MAX(CASE COL WHEN 'C' THEN COL ELSE NULL END), 
    MAX(CASE COL WHEN 'D' THEN COL ELSE NULL END)) 
FROM 
    (SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2") AS T 

이것이 어리 석거나 틀린 지 알려주세요.

0

내가 제대로 질문을 이해한다면, 당신은 아래로 CTE에

SELECT COALESCE( 
    (SELECT COL FROM T WHERE COL = 'A'), 
    (SELECT COL FROM T WHERE COL = 'B'), 
    (SELECT COL FROM T WHERE COL = 'C'), 
    (SELECT COL FROM T WHERE COL = 'D')) 
FROM (SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2") AS T 

을 변환 할 수 있습니다 :이 같은

WITH T AS (
    SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2" 
) 
SELECT COALESCE( 
    (SELECT COL FROM T WHERE COL = 'A'), 
    (SELECT COL FROM T WHERE COL = 'B'), 
    (SELECT COL FROM T WHERE COL = 'C'), 
    (SELECT COL FROM T WHERE COL = 'D')) 
FROM T; 

또는 무언가를. DB2 데이터베이스가 없으므로 테스트 할 수 없습니다.

+0

오른쪽. 불행히도 "with"문은 내가 조회하는 Db2/400 시스템에서 지원되지 않습니다. – Einar

+0

죄송합니다 ... DB2v9.1에서 지원됩니다 ( 은 과거에 사용 했었습니다) –

1

후, 귀하의 질문에 적절한 순서로 정렬 할 하드 코딩 값을 제공 :

SELECT COL 
FROM SOMETABLE 
WHERE X = "txt1" 
AND Y = "txt2" 
ORDER BY col 
fetch first 1 rows only 
0

당신은이 꽤 가까웠다 ...

SELECT COALESCE(
    MAX(CASE COL WHEN 'A' THEN COL ELSE NULL END), 
    MAX(CASE COL WHEN 'B' THEN COL ELSE NULL END), 
    MAX(CASE COL WHEN 'C' THEN COL ELSE NULL END), 
    MAX(CASE COL WHEN 'D' THEN COL ELSE NULL END)) 
FROM 
    (SELECT COL FROM SOMETABLE WHERE X = "txt1" AND Y = "txt2") AS T 

을 당신은 유착이 필요하지 않습니다 (수 ' 여러 열을 중심으로 사용) 서브 쿼리가 필요하지 않습니다 (where 절이 항상 먼저 평가됩니다).

SELECT MAX(CASE WHEN COL = 'A' THEN COL ELSE NULL END) AS A, 
     MAX(CASE WHEN COL = 'B' THEN COL ELSE NULL END) AS B, 
     MAX(CASE WHEN COL = 'C' THEN COL ELSE NULL END) AS C, 
     MAX(CASE WHEN COL = 'D' THEN COL ELSE NULL END) AS D 
    FROM SOMETABLE 
WHERE X = "txt1" 
    AND Y = "txt2" 

일부 데이터베이스는 비슷한 (그러나 동일하지는 않지만) ANSI SQL 표준 PIVOT 기능을 지원합니다.DB2/400에는 많은 고급 기능이 있지만 그렇다고 들리지 않습니다.

+0

간단 해 주셔서 감사합니다! 의미없는 부질의를 제거해야합니다. 내가 합병 할 필요가 있음을 알았습니다. 합병으로 나는 원하는 결과 ('B')를 얻지 못한다. ('-' 'B' '-' 'D'). COL IN ('A', 'B', 'C', 'D')을 말하는 WHERE 절을 추가 할 때 성능상의 이점이 있습니까? 결국, X = "txt1 AND Y ="txt2 ", COL = 'E'와 같은 행이있을 수 있습니다. – Einar

+0

아, 잡았다. '-', 'B', '-', 'D' '예, 추가 필터 추가 * 작업 속도 향상 가능 –

+0

다시 한 번 감사 드리지만 성능 테스트를 실행 해 보겠습니다. – Einar

관련 문제