2017-05-17 2 views
1

J'ai un jeu de données où il est assez courant que les champs aient NULL comme valeur valide. Cela provoque un problème lorsque je veux utiliser l'opérateur ROLLUP dans MySQL, car je ne peux pas faire la distinction entre les valeurs NULL qu'il génère dans ses sous-totaux/totaux et les valeurs réelles NULL dans les données.Sommaire MySQL lorsque certaines colonnes incluent des valeurs NULL

Ma requête actuelle est la suivante:

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

Cela me donne le tableau suivant:

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

quand je voudrais que ce soit:

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

Cette est un exemple simple, et il devient plus frustrant une fois que j'ai plusieurs dimensions pour le ROLLUP. La raison pour laquelle je ne peux pas simplement changer la valeur de NULL avant quelque chose d'autre est que je dois aussi pouvoir agréger les données dans d'autres parties de l'application, donc avoir un bon NULL est important pour moi.

Répondre

2

Une option serait d'enrouler avec une sous-requête qui remplace d'abord les valeurs réelles NULL qui indiquent des données manquantes. Ensuite, utilisez COALESCE() que vous deviez remplacer le NULL du Rollup avec la chaîne "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 

Ici, je l'ai utilisé 99 comme un espace réservé pour indiquer les scores de voiture qui ont été portés disparus. Vous pouvez utiliser n'importe quel espace réservé de votre choix, autre que NULL.

+0

Cela fonctionne très bien! Le seul problème est qu'il va créer plus de travail pour moi car je crée dynamiquement le SQL, mais c'est un bon problème à avoir. Merci! – koend