2016-09-14 5 views
3

Ok,MySQL - Datensatz basierend auf Feldliste, wenn das Feld nicht dort eingeben Dummy-Zeile für das Feld

Also habe ich versucht habe hier über dieses eine ähnliche Frage zu finden. Einen, der sich genau bezieht, nicht sehen.

Ich habe eine Tabelle, die Verkaufsdaten nach Bundesland hat. Die Daten sind so organisiert;

SELECT * FROM SALES_BY_STATE;

PRODUCTGROUP SALES STATE MONTH YEAR 
PRODUCTGROUP1 1000 A  JAN  2016 
PRODUCTGROUP1 1000 B  JAN  2016 
PRODUCTGROUP1 1000 F  JAN  2016 
PRODUCTGROUP1 1000 G  JAN  2016 
PRODUCTGROUP1 1000 H  JAN  2016 
PRODUCTGROUP1 1000 I  JAN  2016 
PRODUCTGROUP1 1000 J  JAN  2016 
PRODUCTGROUP1 1000 K  JAN  2016 
PRODUCTGROUP2 1000 A  JAN  2016 
PRODUCTGROUP2 1000 B  JAN  2016 
PRODUCTGROUP2 1000 C  JAN  2016 
PRODUCTGROUP2 1000 D  JAN  2016 
PRODUCTGROUP2 1000 E  JAN  2016 
PRODUCTGROUP2 1000 F  JAN  2016 
PRODUCTGROUP2 1000 G  JAN  2016 
PRODUCTGROUP2 1000 H  JAN  2016 
PRODUCTGROUP2 1000 I  JAN  2016 
PRODUCTGROUP2 1000 J  JAN  2016 
PRODUCTGROUP2 1000 K  JAN  2016 

Ich habe 11 Zustände (A - K). Ich möchte eine Anweisung erstellen, die die Status anzeigt, unabhängig davon, ob eine zugehörige Zeile für diesen Status vorhanden ist. Wie Sie in den obigen Daten sehen können, hat PRODUCT2 einen Datensatz für den Zustand A - K. In PRODUCTGROUP1 fehlen jedoch einige.

Ich möchte die Daten extrahieren und wie folgt anzeigen;

PRODUCTGROUP SALES STATE MONTH YEAR 
PRODUCTGROUP1 1000 A  JAN  2016 
PRODUCTGROUP1 1000 B  JAN  2016 
PRODUCTGROUP1 0  C  JAN  2016 
PRODUCTGROUP1 0  D  JAN  2016 
PRODUCTGROUP1 0  E  JAN  2016 
PRODUCTGROUP1 1000 F  JAN  2016 
PRODUCTGROUP1 1000 G  JAN  2016 
PRODUCTGROUP1 1000 H  JAN  2016 
PRODUCTGROUP1 1000 I  JAN  2016 
PRODUCTGROUP1 1000 J  JAN  2016 
PRODUCTGROUP1 1000 K  JAN  2016 
PRODUCTGROUP2 1000 A  JAN  2016 
PRODUCTGROUP2 1000 B  JAN  2016 
PRODUCTGROUP2 1000 C  JAN  2016 
PRODUCTGROUP2 1000 D  JAN  2016 
PRODUCTGROUP2 1000 E  JAN  2016 
PRODUCTGROUP2 1000 F  JAN  2016 
PRODUCTGROUP2 1000 G  JAN  2016 
PRODUCTGROUP2 1000 H  JAN  2016 
PRODUCTGROUP2 1000 I  JAN  2016 
PRODUCTGROUP2 1000 J  JAN  2016 
PRODUCTGROUP2 1000 K  JAN  2016 

Macht das Sinn? Ich möchte grundsätzlich den Zustand im Ergebnis zeigen, unabhängig davon, ob es im Datensatz eine verwandte Zeile gibt.

Nicht sicher, wie ich darüber gehen würde. Jede Hilfe würde sehr geschätzt werden.

+0

Dies ist ein sehr nicht-triviales Problem. Ich denke, dass Sie eine Art "Kalender" -Tabelle erstellen müssten, die alle Zustände enthält, und dann würden Sie etwas dynamisches SQL benötigen, um die fehlenden Aufzeichnungen zu erzeugen. Ich glaube nicht, dass nicht-dynamisches SQL das kann, weil die Beziehung zwischen Produktgruppen und Zuständen in vielen Fällen Ihres Datensatzes einfach nicht existiert. –

+0

Danke Tim, vielleicht muss ich ein Programm schreiben, um die fehlenden Datensätze in die Tabelle zu schreiben? – stevenbranigan82

Antwort

2

Sie können eine Gesamtliste mit einem kartesischen Produkt erstellen. Beachten Sie, dass wir dies aus den vorhandenen Daten erstellen. Wenn Sie also plötzlich entscheiden, dass Sie ein STATE "L" haben, dann muss mindestens eine Zeile in der Tabelle SALES_BY_STATE mit diesem STATE vorhanden sein. Gleiches gilt für den Zeitraum.

Die Verwendung einiger temporärer Tabellen verhindert, dass das kartesische Produkt platzt, wenn Sie einen großen Tisch haben.

create temporary table if not exists pg AS select distinct PRODUCTGROUP from SALES_BY_STATE; 
create temporary table if not exists st AS select distinct STATE from SALES_BY_STATE; 
create temporary table if not exists mo AS select distinct MONTH from SALES_BY_STATE; 
create temporary table if not exists yr AS select distinct YEAR from SALES_BY_STATE; 

select list.PRODUCTGROUP, list.STATE, list.MONTH, 
    list.YEAR, IFNULL(s.SALES, 0) 

FROM 
    (select distinct PRODUCTGROUP, STATE, MONTH, YEAR 
    FROM pg, st, mo, yr ) as list 

LEFT JOIN 
    SALES_BY_STATE as s 
ON 
    list.PRODUCTGROUP = s.PRODUCTGROUP and list.STATE = s.STATE 
    and list.MONTH = s.MONTH AND list.YEAR = s.YEAR 
ORDER BY 
    list.PRODUCTGROUP, list.STATE, list.MONTH, list.YEAR 
+0

Ich war gerade dabei, zu kommentieren und ich las Ihre Bearbeitung .. es ist eine gute Lösung, aber nicht eine sehr effiziente geben Sie die Größe der Tabelle, mit der ich arbeite. Vielen Dank für die Anregung. – stevenbranigan82

+0

Ich habe gerade meine Lösung aktualisiert, das sollte viel schneller laufen. –

+0

Mate, brillante Lösung! Danke dafür, es hat perfekt funktioniert! Ich habe gerade einige Berichtstabellen erstellt, um eine Lösung dafür zu finden. Ausgezeichneter Kumpel. Ich schulde dir auch Bier – stevenbranigan82

Verwandte Themen