2014-12-01 5 views
1

어려운 쿼리를 작성해야하는데 도움이 필요합니다. 이러한 열 이름은 가짜 : Oracle SQL의 쿼리 개선

나는 다음과 같은 테이블이 ( MyTable)

C1 int, 
C2 int, 
C3 int, 
. 
. 
C79 int 
C80 int 

가 있습니다. 실제 열 이름은 비슷하지 않습니다. 각 열의 이름은 다른 열과 유사하지 않습니다.

나는 다음과 같은 쿼리 (queryA)가 :

나는 각 순차 열이 쿼리를 실행해야
select cnt/(select count(*) from MyTable) 
    from (
    select c1, c2, count(*) over(partition by c1, c2) cnt 
    from MyTable); 

: C (I) - C (I + 1), C (I + 1) - C (i + 2) ... 위 쿼리에서 나는 c1과 c2를 실행했습니다.

또한 위의 쿼리와 같은 두 가지 유사한 쿼리가 있습니다. 출력 테이블에서 각 순차 열은 3 개의 쿼리로부터 3 개의 계산을 갖습니다.

(float 있어야 열 모든 유형의) 그 같이하기로 출력 테이블 : 내가 충분히 분명 희망

c12A - calculation of query A for c1-c2 
c12B - calculation of query B for c1-c2 
c12C - calculation of query C for c1-c2 
c23A - calculation of query A for c2-c3 
c23B - calculation of query B for c2-c3 
c23C - calculation of query C for c2-c3 
. 
. 
. 
c7980A - calculation of query A for c79-c80 
c7980B - calculation of query B for c79-c80 
c7980C - calculation of query C for c79-c80 

. 어떤 추천을하는 방법?

답변

0
WITH t1 AS (
SELECT 'MYTABLE' nm FROM dual 
), 
t2 AS (
select rw, c1, c2 from (
    SELECT column_id rw, column_name c1, 
      lead(column_name) OVER(ORDER BY column_id) c2 FROM cols CROSS JOIN t1 
    WHERE table_name = t1.nm 
) WHERE c2 IS NOT NULL 
) 
SELECT 0 rw, 'select rw,n/n_all from (select count(*) n_all from ' || nm || ') cross join (' FROM t1 
UNION ALL 
SELECT rw, CASE WHEN rw > 1 THEN 'union all ' END || 'select ' || rw 
      || ' rw, count(*) over(partition by ' || c1 || ', ' || c2 || ') n from ' || t1.nm 
FROM t2 CROSS JOIN t1 
UNION ALL 
SELECT 10000 rw, ') order by rw' FROM dual 
order by rw; 

당신은 오라클의 사전 cols (= user_tab_columns)를 사용하여 쿼리 문자열을 생성 할 수 있습니다.

+0

lead(column_name) OVER(ORDER BY column_id)가 대단히 감사합니다 :

나는 컬럼의 "순서를"정의 cols.column_id을 사용했다. 나는이 쿼리를 실행하려고, 다음과 같은 오류가 발생했습니다 : "RW": 유효하지 않은 식별자 (11 행). 이 쿼리는 너무 복잡해서이 문제를 해결할 수 없었습니다. – Omri

+0

@Omri 죄송합니다, 작은 실수가있었습니다. 내 대답을 업데이트했습니다 – Multisync

+0

고마워요. 이제 쿼리가 오류를 반환하지 않지만 출력이 손상된 것 같습니다. 두 개의 열이 있습니다. 첫 번째 열의 이름은 1에서 81까지의 숫자를 포함하는 RW이고 마지막 열의 값은 10000으로 점프됩니다. 두 번째 열은 쿼리와 비슷한 값을가집니다. 예 : "union allselect22 rw, 파티션을 기준으로 개수 (*)"... ". 나는 여러 번 검사했고 나의 질문은 당신과 똑같습니다. 어떤 생각? - Omri 6 분 전 – Omri