2017-10-16 12 views
-2

Salut, je rejoins une table avec une plage de 1 mois, pour obtenir le nombre par jour basé sur la table de jointure (table de base).Le groupe PLSQL par avec la table de plage joine affiche le nombre correct

Pour cela, j'utilise la jointure externe gauche pour obtenir le nombre de par jour. où ma table de base est comme indiqué ci-dessous (nom de la table Registrierung]

enter image description here

Et je créer gamme d'un mois en utilisant ci-dessous requête

SELECT TO_DATE ('01-10-2017', 'dd-mm-yyyy') + ROWNUM - 1 AS daterange 
    FROM all_objects 
WHERE ROWNUM <= 
      TO_DATE ('30-10-2017', 'dd-mm-yyyy') 
      - TO_DATE ('01-10-2017', 'dd-mm-yyyy') 
      + 1; 

enter image description here

mais j'obtenir le nombre 1 pour la date où il y a maintenant enregistrement correspondant à la table de plage au lieu de 0.

J'utilise ci-dessous la requête pour le résultat final.

SELECT TRUNC (a.daterange), COUNT (a.daterange) 
    FROM (SELECT TO_DATE ('01-10-2017', 'dd-mm-yyyy') + ROWNUM - 1 
         AS daterange 
       FROM all_objects 
       WHERE ROWNUM <= 
         TO_DATE ('30-10-2017', 'dd-mm-yyyy') 
         - TO_DATE ('01-10-2017', 'dd-mm-yyyy') 
         + 1) a 
     LEFT OUTER JOIN 
      REGISTRIERUNG b 
     ON TRUNC (a.daterange) = TRUNC (b.MODIFIKATIONZEIT) 
GROUP BY TRUNC (a.daterange) 
ORDER BY TRUNC (a.daterange) ASC; 

enter image description here

Répondre

0

Vous ne devriez pas compter les lignes en fonction de la colonne qui est toujours peuplé (dans votre requête a.daterange est toujours peuplée, car cette colonne de votre point de vue en ligne a toutes les dates dans un mois) . Au contraire, vous devez compter le nombre de lignes de la table jointe à la vue en ligne avec les dates générées. Notez que la fonction count ne prendra pas en compte les lignes ayant la valeur null dans la colonne modifikationzeit.

Par exemple:

select a.daterange, 
     count(b.modifikationzeit) 
    from (select to_date('01-10-2017', 'dd-mm-yyyy') + level - 1 as daterange 
      from dual 
     connect by level <= to_date('31-10-2017', 'dd-mm-yyyy') - 
          to_date('01-10-2017', 'dd-mm-yyyy') + 1) a 
    left outer join registrierung b 
    on a.daterange = trunc(b.modifikationzeit) 
group by a.daterange 
order by a.daterange; 

J'ai enlevé trunc's inutile, et converti de requête all_objects à celui qui utilise la clause connect by. J'ai également fixé la génération de date pour Octobre - il a 31 jours, pas 30 selon votre exemple.

+0

Thnaks ça marche – user432843