2

テーブルをフラット化する必要がありますが、ここが難しい部分です。クロマンは動的であり、新しい ID を含む新しいレコードが追加されたときにクエリが機能するはずです。

これは私の作業クエリです(これは実際には何百もの値です):

SELECT *
FROM   (select qv.respnr, sq.question_id, qv.question_value
from survey_question sq, question_values qv
where qv.question_id = sq.question_id
and sq.survey_id = 1
order by qv.respnr, page, ranked)
PIVOT (
MAX(question_value)        --<-- pivot_clause
FOR question_id          --<-- pivot_for_clause
IN (346 as c346,347 as c347)
)

を次のようなものに置き換えたいIN (346 as c346,347 as c347)

SELECT mq.question_id
  FROM meta_question mq, survey_question sq2
 WHERE sq2.survey_id = 1
   AND mq.question_id = sq2.question_id
 ORDER BY page, ranked

これを行う方法はありますか?

IN を単純に select ステートメントで指定できないことに気付いたので、これは機能しません。

IN (SELECT mq.question_id
      FROM meta_question mq, survey_question sq2
     WHERE sq2.survey_id = 1
       AND mq.question_id = sq2.question_id
     ORDER BY page, ranked)
4

2 に答える 2

2

SQL のすべての列の名前と型は、コンパイル時に認識される必要があります。ここでは、データに応じて列の数を変更する必要があるため、動的 SQLを使用する必要があります。

PL/SQL を使用する場合は、ref カーソルを使用できます。

DECLARE
   l_rc            SYS_REFCURSOR;
   l_dynamic_query VARCHAR2(32000);
BEGIN
   FOR cc IN (SELECT mq.question_id
                FROM meta_question mq, survey_question sq2
               WHERE sq2.survey_id = 1
                 AND mq.question_id = sq2.question_id
               ORDER BY page, ranked) LOOP
      -- build dynamic query here
   END LOOP;
   OPEN l_rc FOR '
      SELECT *
        FROM (SELECT qv.respnr, sq.question_id, qv.question_value
                FROM survey_question sq, question_values qv
               WHERE qv.question_id = sq.question_id
                 AND sq.survey_id = 1
               ORDER BY qv.respnr, page, ranked) 
               PIVOT ( MAX (question_value) --<-- pivot_clause
                       FOR question_id --<-- pivot_for_clause
                        IN (' || l_dynamic_query || ')
                      )';
    -- process l_rc (LOOP..FETCH..CLOSE)
END;

も使用できますDBMS_SQL

于 2013-02-26T15:30:29.667 に答える
1

a の列はpivot既知である必要があるため、動的 SQL を使用して結果を生成する必要があります。通常、ref_cursor を使用してプロシージャを生成し、次のようなタスクを実行します。

CREATE OR REPLACE procedure dynamic_pivot_q(p_cursor in out sys_refcursor)
as
    sql_query varchar2(8000) := 'select qv.respnr ';

    begin
        for x in (select distinct question_id, mname from meta_question order by 1)
        loop
            sql_query := sql_query ||
                ' , max(case when mq.question_id = '||x.question_id||' then qv.question_value else null end) as "c'||x.mname||'"';

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from meta_question mq  
                                    left join survey_question sq 
                                      on mq.question_id = sq.question_id  
                                      and sq.survey_id = 1  
                                    inner join question_values qv 
                                      on qv.question_id = sq.question_id 
                                      and sq.survey_id = 1 
                                    group by qv.respnr';

        dbms_output.put_line(sql_query);

        open p_cursor for sql_query;
    end;
/

次に、次の方法で実行できます (注: これは TOAD で使用するコードです)。

variable x refcursor
exec dynamic_pivot_q(:x)
print x
于 2013-02-26T15:40:07.497 に答える