Pivot-Zeilen-Spalten basierend auf deren Inhalt, in Oracle 10g PL/SQL

Ich habe eine Tabelle in meiner Datenbank, user_answers speichert die Benutzer Antworten auf eine Reihe von Fragen, mit Reihen; user_id, question_id, answer_id und text_entry. Frage-und Antwort-text (falls vorhanden) gespeichert sind, in lookup-Tabellen. Es gibt drei Arten von Fragen, einfach Fragen, multiple-Fragen zu beantworten und text-Eintrag Fragen zu beantworten. So ein einzelner Benutzer kann Einträge, wie den folgenden in den user_answers Tabelle:

user_id    question_id    answer_id    text_entry
-------    -----------    ---------    ----------
  123          100          1010         (null)
  123          200          2010         (null)
  123          200          2030         (null)
  123          300          3000       "code 789"

Können sagen, dass die questions_text Tabelle:

question_id         text
-----------    -------------
    100           "Gender"
    200         "Interests"
    300         "Your code"

und die answers_text Tabelle:

answer_id       text
---------    -----------
   1010       "Female"
   1020        "Male"
   2010       "Sports"
   2020      "Computers"
   2030       "Movies"
   3000        (null)

Möchte ich extrahieren Sie die Daten in eine csv-Datei mit einer Zeile pro user_id zeigen die Antworten, so etwas wie dieses:

User,Gender,Sports,Computers,Movies,Code
123,Female,1,0,1,code 789

Ich weiß, wie zu generieren der CSV-Datei per SQLPlus (ich habe nur Zugriff auf die DB via SQLPlus aus Gründen, die außerhalb meiner Kontrolle...), aber ich weiß nicht, wie zu generieren der PL/SQL-Anweisung.

In PL/SQL ich weiß, ich kann erzeugen ein Dreh-und Angelpunkt der Gender-Frage zu tun

SELECT
   user_id || ',' ||
   MIN(DECODE(question_id, '100', (SELECT text FROM answers_text where answer_id = answer_text.answer_id)))
FROM user_answers
GROUP BY user_id
ORDER BY user_id
;

(Ich bin kein SQL-guy, also, das ist kopiert aus dem Internet!)

Dieser code ist (zumindest soweit mein Test sagt mir) gut für den single-Fragen beantworten aber nicht die Arbeit auf mehrere-Antwort-oder nur-text-Eintrag-Art Fragen.

Sah ich einige Sachen online, über die Verwendung des case - Anweisung in PL/SQL etwa so:

MIN(CASE WHEN question_id = '200' AND answer_id = '2010' THEN '1' ELSE '0' END)

...aber ich kann nicht herausfinden, wie man die Antworten in Spalten. Und alle, die SO Fragen, die ich finden kann, könnte damit zusammenhängen, sind sql-server-spezifisch.

Gibt es einen Weg zu erzeugen, meine gewünschte Ausgabe aus einer einzigen PL/SQL-Anweisung? Vorzugsweise in einer Weise geschrieben, dass hängt nicht von den Daten in den Tabellen, wie wir eine Reihe von Datenbanken, die diese möglicherweise benötigen, um ausgeführt werden auf.

InformationsquelleAutor beggs | 2009-11-02

Schreibe einen Kommentar