1
votes

Comment afficher count () avec des lignes égales à zéro avec une seule table

Donc, en gros, disons que j'ai un tableau appelé "ventes" répertoriant toutes les ventes effectuées dans une boutique.

Pour faire simple, nous allons garder trois colonnes:

    VENDOR      COUNT(VENDOR)       

1   Camille     3   
2   Delphine    2
3   Lucas       2   
4   Penelope    2
5   Rudy        3

J'essaie simplement de résumer les ventes de chaque fournisseur pour une période de temps donnée. Alors naturellement, j'essaye d'utiliser une fonction count () avec une instruction "group by":

select vendor, count(vendor)
from sales 
where vendor in ('Camille', 'Lucas', 'Delphine', 'Rudy', 'Penelope', 'Alice')
group by vendor    
order by vendor;

Le résultat est le suivant:

 SALE_ID    DATE_SALE     VENDOR    

1   101     2019/01/01      Camille 
2   102     2019/01/01      Lucas
3   103     2019/01/02      Rudy   
4   104     2019/01/01      Lucas
5   105     2019/01/01      Delphine
6   106     2019/01/03      Penelope
7   107     2019/01/02      Rudy
8   108     2019/01/03      Delphine
9   109     2019/01/03      Camille   
10  110     2019/01/04      Rudy
11  111     2019/01/02      Camille
12  112     2019/01/04      Penelope


1 commentaires

Vous devriez avoir une table avec tous les vendeurs. Quel est son nom et sa structure?


3 Réponses :


1
votes

Je rejoindrais la table vendors comme ceci:

select v.vendor, count(s.vendor)
  from vendors v left outer join sales s on (s.vendor = v.vendor)
 where v.vendor in ('Camille', 'Lucas', 'Delphine', 'Rudy', 'Penelope', 'Alice')
 group by v.vendor
 order by v.vendor;

En supposant que vous ayez une table nommée vendors avec tous les fournisseurs (y compris Alice) là-dedans.


1 commentaires

Vous devez commencer par fournisseurs et jointure gauche pour ventes ... Ou vous pouvez utiliser une jointure droite , mais je trouve celles-ci moins intuitives ...



0
votes

Étant donné votre commentaire selon lequel vous ne pouvez pas avoir de table fournisseurs , voici une approche alternative qui en crée une pour vous, puis utilise une jointure externe pour inclure Alice :

select t.name, count(s.vendor) as thecount
from (select column_value name 
      from table(sys.dbms_debug_vc2coll('Camille', 'Lucas', ..., 'Alice'))) t
  left join sales s on t.name = s.vendor
group by t.name

Remarque, il existe plusieurs façons de créer la fausse table. Cela utilise une procédure intégrée à laquelle vous devez avoir accès. Vous pouvez également être plus explicite et le définir en utilisant union all .


0 commentaires

0
votes

En supposant que vous ne disposez pas d'une table VENDOR , vous pouvez utiliser une vue en ligne pour générer vos noms de fournisseurs:

WITH cteVendors as (SELECT 'Camille' AS VENDOR FROM DUAL UNION ALL
                    SELECT 'Lucas' AS VENDOR FROM DUAL UNION ALL
                    SELECT 'Delphine' AS VENDOR FROM DUAL UNION ALL
                    SELECT 'Rudy' AS VENDOR FROM DUAL UNION ALL
                    SELECT 'Penelope' AS VENDOR FROM DUAL UNION ALL
                    SELECT 'Alice' AS VENDOR FROM DUAL)
SELECT v.VENDOR, COUNT(s.VENDOR)
  FROM cteVendors v
  LEFT OUTER JOIN SALES s
    ON s.VENDOR = v.VENDOR
  GROUP BY v.VENDOR
  ORDER BY v.VENDOR

dbfiddle ici


0 commentaires