2016-04-05 3 views
1

Betrachten Sie die folgende MySQL-TabelleWie Reihen auf die maximale Anzahl von nicht null-Werte in MySQL basiert fusionieren

T

c1 c2 c3 c4 
------------------- 
X NULL NULL NULL 
w NULL NULL NULL 
NULL y NULL NULL 
NULL Z NULL NULL 
NULL NULL P NULL 
NULL NULL NULL A 
NULL NULL Q NULL 
NULL NULL NULL B 
NULL NULL NULL C 

Jetzt Ausgabe wie diese Ich möchte

c1 c2 c3 c4 
------------------- 
x Y P A 
w z Q B 
NULL NULL NULL C 

Wie Sie sehen können, wird die Ausgabe basierend auf der maximalen Anzahl von Nicht-Null-Werten in den Spalten angezeigt.

Kann jemand mir helfen, wie dies mit mysql erreichen.

UPDATE

nur eine Spalte Wert in der Zeile wird immer nicht null und Rest von drei Spalten immer null sein.

+0

Wenn nur 1 Spalte ausgefüllt wird, dann sieht es wie ein schlechtes Design aus.Sie können 2 Spalten hinzufügen, der erste enthält den Wert, den Sie als Spaltenname eingegeben haben, und die zweite Spalte enthält den Wert. – Spidey

+0

@Nimesh Dies ist keine entworfene Tabelle, aber die Ausgabe von Pivot-Tabelle generiert Abfrage lesen Sie hier, als Sie den Zweck verstehen, beziehen Sie sich auf http://stratosprovatopoulos.com/web-development/mysql/pivot-a-table-in -mysql/ – geeksal

+0

Ich weiß, was eine Pivot-Tabelle ist und wie es funktioniert, Sie haben das als Tabelle erwähnt, also habe ich den Vorschlag hinzugefügt. Ist das die Ausgabe, dann hättest du das entsprechend erwähnen sollen und den Code bereitgestellt. Übrigens, hast du 'coalesce' verwendet, wie in Schritt 4 des Artikels erwähnt, um die Nullen loszuwerden? – Spidey

Antwort

1

Diese Abfrage bitte:

SELECT 
MAX(CASE WHEN t.colName = 'C1' THEN t.f ELSE NULL END) AS 'C1', 
MAX(CASE WHEN t.colName = 'C2' THEN t.f ELSE NULL END) AS 'C2', 
MAX(CASE WHEN t.colName = 'C3' THEN t.f ELSE NULL END) AS 'C3', 
MAX(CASE WHEN t.colName = 'C4' THEN t.f ELSE NULL END) AS 'C4' 
FROM 
(
    SELECT c2 AS f, 
     'C2' AS colName, 
     @rn2 := @rn2 + 1 row_number 
    FROM mergetable,(SELECT @rn2 := 0) var 
    WHERE c2 IS NOT NULL 

    UNION 

    SELECT c1, 
     'C1' AS colName, 
     @rn1 := @rn1 + 1 row_number 
    FROM mergetable,(SELECT @rn1 := 0) var 
    WHERE c1 IS NOT NULL 

    UNION 

    SELECT 
     c4, 
     'C4' AS colName, 
     @rn4 := @rn4 + 1 row_number 
    FROM mergetable,(SELECT @rn4 := 0) var 
    WHERE c4 IS NOT NULL 

    UNION 

    SELECT 
     c3, 
     'C3' AS colName, 
     @rn3 := @rn3 + 1 row_number 
    FROM mergetable,(SELECT @rn3 := 0) var 
    WHERE c3 IS NOT NULL 
) t 
GROUP BY t.row_number; 

Bitte überprüfen Sie die DEMO HERE

Erläuterung:

einer der inneren Abfragen vor:

Hier ist eine:

SELECT c2 AS f, 
'C2' AS colName, 
@rn2 := @rn2 + 1 row_number 
FROM mergetable,(SELECT @rn2 := 0) var 
WHERE c2 IS NOT NULL; 

Ausgang für Spalte C2:

f colName row_number 
y  C2   1 
z  C2   2 

Eigentlich jeder der obigen inneren Abfrage wird eine gleichermaßen Ausgangsstruktur geben:

Ausgang für Spalte C1:

f colName row_number 
x C1  1 
w C1  2 

Ausgang für Spalte C3:

f colName row_number 
p C3   1 
Q C3   2 

Ausgang für Spalte C4:

f colName row_number 
A  C4   1 
B  C4   2 
C  C4   3 

Nun, wenn Sie UNION sie alle erhalten Sie eine Ausgangsstruktur wie unten erhalten:

f colName row_number 
y  C2   1 
z  C2   2 
x  C1   1 
w  C1   2 
A  C4   1 
B  C4   2 
C  C4   3 
p  C3   1 
Q  C3   2 

Schau, wenn ich nicht die Spaltennamenspalte in jeder der inneren Abfragen verwendet hätte, gäbe es jetzt einen Weg um zu wissen, welcher Wert zu welcher Spalte gehört.

Jetzt von der oben genannten endgültigen Ausgabestruktur, wenn Sie pivoting verwenden, dann können Sie leicht die erwartete Ausgabe ableiten.

+0

Ihr CODE scheint zu funktionieren. Erklären Sie mir einfach, was der folgende Code tut. SELECT C2 AS f, C2 'AS colName, @ rn2: = @ rn2 + 1 row_number VON mergetable, (SELECT @ rn2: = 0) var WO c2 NICHT NULL ist Ich bin immer noch neu, um sql voranzukommen – geeksal

+0

Bitte überprüfen Sie jetzt. Ich habe eine Erklärung hinzugefügt. @geeksal – 1000111

+0

danke ich verstehe es teilweise wie, aber ich werde eine klarere Erklärung oder ein Tutorial Link auf dem gleichen empfehlen. Irgendwelche Möglichkeiten Akzeptiert Ihre Antwort, aber immer noch versuchen, das Konzept zu lernen. :) – geeksal

Verwandte Themen