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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zu erreichen, was du suchst (und nicht spezifisch für dieses Daten -) ich glaube, Sie gehen zu müssen einige zusätzliche Felder in den Tabellen. Zum Beispiel, müssen Sie wissen, welche Fragen sind Single-Antwort, Mehrfach-Antwort, und Text-Eintrag ohne Blick auf die Daten. Sie müssen auch wissen, welche Antworten möglich sind, für Ihre Multi-beantworten Sie die Fragen ohne link, über den Daten. Von dort aus können Sie eine Schleife durch die meta-Informationen zu jedem Frage /Antwort-Kombination und Bau dir eine Abfrage ausführen, werden die Daten zurück, die in Ihrem gewünschten format. So etwas wie:
InformationsquelleAutor Craig
Abfragen mit einer unbekannten Anzahl von Spalten sind problematisch, am besten. Wird Sie wirklich nicht wissen, wie die Daten Aussehen wird? Vielleicht möchten Sie sich an dieser Fragen Tom Antwort für ein Paket, das vielleicht helfen Ihnen die Ergebnisse, die Sie brauchen.
InformationsquelleAutor Adam Hawkes