0
votes

MySQL: revenant compte (*) avec NULL ou 0 Valeurs

J'ai trois tables Compteinales & Icecream. Dans le but de comprendre, il y a une crème glacée dans chaque vente.

Les TABLESINES STRUT> TABLE CONTINENT (CUSTHISIDE, COMPLETIDE, Code postal, ICECREAMID) P>

ICE_CREAM STRUT> contient (Nom IL ICE_CREAM, ID_CREAM ID) P> J'essaie d'écrire une requête qui retourne la quantité de ventes de la crème glacée au chocolat à chaque code postal (code postal), mais je souhaite également savoir quels codes postaux avaient des ventes zéro. Actuellement, il ne fait que renvoyer les codes postaux qui avaient des ventes. P>

SELECT C.postcode, COUNT(*) AS TOTAL SALES
FROM CustomerSales C OUTER LEFT JOIN IceCream I
ON C.icecreamID = I.id AND
WHERE I.name = "Chocolate" AND C.saleyear = "2019"
GROUP BY C.postcode;


0 commentaires

5 Réponses :


2
votes

Comptez le commandant, au lieu de *, je pense que cela devrait renvoyer les résultats attendus:

SELECT C.postcode, COUNT(C.PurchaseId) AS TOTAL SALES
FROM CustomerSales C OUTER LEFT JOIN IceCream I
ON C.icecreamID = I.id AND
WHERE I.name = "Chocolate" AND C.saleyear = "2019"
GROUP BY C.postcode;


2 commentaires

et où n'est pas une syntaxe valide, il est donc plutôt mystérieux que cette réponse soit acceptée.


Certes, j'aurais dû payer plus d'attention. Merci d'avoir fait remarquer cela.



1
votes
SELECT C.postcode, COUNT(*) AS TOTAL_SALES
FROM CustomerSales C JOIN IceCream I
ON C.icecreamID = I.id AND
WHERE I.name = "Chocolate" AND C.saleyear = "2019"
GROUP BY C.postcode

union

select c.postcode, '0' as TOTAL_SALES
FROM CUSTOMERSALES C 
where c.postcode not in(select cs.postcode from 
FROM CustomerSales C JOIN IceCream I
ON C.icecreamID = I.id AND
WHERE I.name = "Chocolate" AND C.saleyear = "2019"
);

0 commentaires

1
votes

Problème Je vois, c'est que vous faites une jointure puis comptant le nombre d'enregistrements renvoyés afin que les enregistrements par défaut qui n'ont pas de ventes ne se terminent pas dans la jointure.

Le type de jointure est important ici, je pense que la jointure à gauche montrera à tous Données de la première table, même si aucune donnée n'est trouvée dans la table jointe, vous compterez ensuite les champs de la table jointe, qui retournera NULL si aucun n'est trouvé p>

quelque chose comme ceci: P>

SELECT C.postcode, COUNT(I.name) AS TOTAL SALES
FROM CustomerSales C LEFT JOIN IceCream I
ON C.icecreamID = I.id AND
WHERE I.name = "Chocolate" AND C.saleyear = "2019"
GROUP BY C.postcode;


0 commentaires

0
votes

Si vous voulez tous em> les codes postaux, vous devez faire un gauche code> rejoindre le distinct code> Codes postaux sur Communérosales Code> puis à Code ICECREAM CODE>:

SELECT p.postcode, COUNT(C.PurchaseId) AS TOTAL_SALES
FROM (
  SELECT DISTINCT postcode
  FROM CustomerSales
) p LEFT JOIN CustomerSales C 
ON C.postcode = p.postcode AND C.saleyear = '2019'
LEFT JOIN IceCream I ON C.icecreamID = I.id AND I.name = 'Chocolate'
GROUP BY p.postcode;


0 commentaires

0
votes

juste pour être clair, vous souhaitez utiliser un rejoindre code>, déplacez la condition sur i code> dans la clause code> sur code> et modifiez le Nombre () Code>:

SELECT C.postcode, COUNT(i.id) AS TOTAL SALES
FROM CustomerSales C LEFT JOIN
     IceCream I
     ON C.icecreamID = I.id AND
        I.name = 'Chocolate'
WHERE C.saleyear = 2019
GROUP BY C.postcode;


0 commentaires