mysql pivot - /Kreuztabellen-Abfrage
Frage 1: ich habe eine Tabelle mit den unter-Struktur und-Daten:
app_id transaction_id mobile_no node_id customer_attribute entered_value
100 111 9999999999 1 Q1 2
100 111 9999999999 2 Q2 1
100 111 9999999999 3 Q3 4
100 111 9999999999 4 Q4 3
100 111 9999999999 5 Q5 2
100 222 8888888888 4 Q4 1
100 222 8888888888 3 Q3 2
100 222 8888888888 2 Q2 1
100 222 8888888888 1 Q1 3
100 222 8888888888 5 Q5 4
Möchte ich die Anzeige dieser Datensätze in der unten format:
app_id | transaction_id | mobile | Q1 | Q2 | Q3 | Q4 | Q5 |
100 | 111 | 9999999999 | 2 | 1 | 4 | 3 | 2 |
100 | 222 | 8888888888 | 3 | 1 | 2 | 1 | 4 |
Ich weiß, ich muss zu verwenden Kreuztabellen/pivot-Abfrage zum abrufen dieser Anzeige. Für diese habe ich versucht es über die wenigen Kenntnisse, die ich über es. Folgende ist meine Abfrage:
SELECT app_id, transaction_id, mobile_no,
(CASE node_id WHEN 1 THEN entered_value ELSE '' END) AS user_input1,
(CASE node_id WHEN 2 THEN entered_value ELSE '' END) AS user_input2,
(CASE node_id WHEN 3 THEN entered_value ELSE '' END) AS user_input3,
(CASE node_id WHEN 4 THEN entered_value ELSE '' END) AS user_input4,
(CASE node_id WHEN 5 THEN entered_value ELSE '' END) AS user_input5
FROM trn_user_log
GROUP BY app_id, transaction_id, mobile_no, node_id
Und basierend auf dieser Abfrage, ich habe die unten angezeigt:
app_id transaction_id mobile_no user_input1 user_input2 user_input3 user_input4 user_input5
100 111 9999999999 2
100 111 9999999999 1
100 111 9999999999 4
100 111 9999999999 3
100 111 9999999999 2
100 222 8888888888 3
100 222 8888888888 1
100 222 8888888888 2
100 222 8888888888 1
100 222 8888888888 4
Kann mir jemand helfen mit den richtigen änderungen, die ich machen muss zu meiner Abfrage, um die Datensätze in einer einzelnen Zeile und nicht mehrere Zeilen wie oben.
Frage 2: Auch ist es ein Weg, um den Wert eines bestimmten Feldes als der NAME der Spalte. Wie Sie sehen können, habe ich oben user_input1
, user_input2
... als der header. Stattdessen möchte ich die Werte in customer_attribute
als überschrift der Spalten.
Dafür habe ich überprüft NAME_CONST(name,value)
wie folgt:
SELECT app_id, transaction_id, mobile_no,
NAME_CONST(customer_attribute, (CASE node_id WHEN 1 THEN entered_value ELSE '' END))
FROM trn_user_log
Aber es gibt einen Fehler,
Error Code : 1210 Incorrect arguments to NAME_CONST
Hilfe erforderlich.
InformationsquelleAutor DarkKnightFan | 2012-09-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während @John ' s statische Antwort funktioniert Super, wenn man eine unbekannte Anzahl von Spalten, die Sie möchten, zu transformieren, würde ich prüfen, mit prepared statements um die Ergebnisse zu erhalten:
sehen SQL Fiddle mit Demo
So weit, als das zweite, bitte klären Sie, was Sie zu tun versuchen, ist nicht klar.
kein problem, verstehe ich nicht Ihre zweite Frage wenn.
ja das ist sehr schwierig.. und ich bezweifle, dass wäre sogar möglich, das schreiben in eine SQL. Ich möchte den Wert einer Spalte sagen
customer_attr
werden diese als Kopfzeile in Ort deruser_input
. So zum BeispielQ1
angezeigt werden soll, in Ort deruser_input1
. Ich weiß, ich kann damit umgehen, was in der java-code durch abrufen der header-Spalten getrennt und die Anzeige ebenfalls. Aber ich Frage mich, ob so etwas möglich ist oder nicht. Anyways vielen Dank für Ihre Hilfe.Ich bin nicht sicher, ob es möglich ist, getestet habe ich es aber nicht zum laufen bekommen.
InformationsquelleAutor Taryn
Hinzufügen
GROUP_CONCAT
in IhremCASE
KlauselSQLFiddle Demo
warum haben die in der SQLFiddle arbeiten? entfernen
node_id
in deinem group by-KlauselAusgezeichnet! es funktionierte nun. Vergessen zu entfernen
node_id
von der groupby. Haben Sie die Antwort auf meine zweite Frage? Anzeige Wertcustomer_attribute
im Ortuser_inputx
?sorry ich kann dir nicht helfen mit, dass, es scheint Ihr konvertieren Sie den Datensatz auf den Namen der Spalte.
InformationsquelleAutor John Woo
@DarkKnightFan, das war eine sehr hilfreiche Frage für eine Aufgabe ich arbeiten war. Ich ging voran und verändert die Lösung von @bluefin zu lösen, Ihre zweite Frage. Der folgende code erzeugt Ihr ursprünglich gewünschten format mit dem Wert von customer_attribute, wie die daraus resultierenden Spaltenüberschriften in der Kreuztabelle.
Die relevante änderung war die änderung:
:
Der vollständige code:
Auch, für andere Mitglieder dieses Problem, wenn Sie eine Menge von Werten, die Sie versuchen, cross-tab, können Sie führen Sie in die Irre, weil GROUP_CONCAT() ist eine Standard-Länge von 1024 Zeichen. Zu erhöhen, setzen Sie diese an den Anfang Ihres vorbereitete Anweisung:
InformationsquelleAutor Kolath