2017-05-17 1 views
1

Ich habe ein Dataset, in dem es Felder gibt, die normalerweise NULL als gültigen Wert haben. Dies führt zu einem Problem, wenn ich den ROLLUP-Operator in MySQL verwenden möchte, da ich nicht zwischen den NULL-Werten, die er als Teil seiner Zwischensummen/Summen generiert, und den tatsächlichen NULL-Werten in den Daten unterscheiden kann.MySQL-Rollup, wenn einige Spalten NULL-Werte enthalten

Meine aktuelle Abfrage ist wie folgt:

SELECT 
    COALESCE(car_score, "Total") AS car_score, 
    COUNT(DISTINCT id) AS volume 
FROM cars_table 
GROUP BY 
    car_score ASC WITH ROLLUP; 

Dies bietet mir mit der folgenden Tabelle: Diese

cars_score | volume 
--------------------------- 
NULL   | 500 
1   | 100 
2   | 200 
3   | 300 
4   | 400 
5   | 500 
Total  | 2000 

:

cars_score | volume 
--------------------------- 
Total  | 500 
1   | 100 
2   | 200 
3   | 300 
4   | 400 
5   | 500 
Total  | 2000 

wenn ich kann es sein mag ist ein einfaches Beispiel, und es wird frustrierender, wenn ich mehrere Dimensionen für die ROLLUP habe. Der Grund, warum ich den Wert nicht einfach auf etwas anderes ändern kann, ist, dass ich auch in der Lage sein muss, die Daten in anderen Teilen der Anwendung zu aggregieren, so dass eine korrekte NULL für mich wichtig ist.

Antwort

2

Eine Option wäre das Umbrechen mit einer Unterabfrage, die zuerst die tatsächlichen NULL Werte ersetzt, die auf fehlende Daten hinweisen. Verwenden Sie dann COALESCE(), wie Sie die NULL aus dem Rollup mit der Zeichenfolge ersetzen waren "Total":

SELECT 
    COALESCE(t.car_score, 'Total') AS car_score, 
    COUNT(DISTINCT t.id) AS volume 
FROM 
(
    SELECT COALESCE(cars_score, 99) AS car_score, id 
    FROM cars_table 
) t 
GROUP BY t.car_score WITH ROLLUP 

Here I 99 als Platzhalter verwendet haben, um Auto Werte zu zeigen, die fehlten. Sie können einen beliebigen Platzhalter verwenden, mit Ausnahme von NULL.

+0

Das funktioniert super! Das einzige Problem ist, dass es mehr Arbeit für mich schafft, da ich das SQL dynamisch erstelle, aber es ist ein gutes Problem. Vielen Dank! – koend

Verwandte Themen