0
votes

Retour Note Valeur en arrière SI 0 Si vide ou aucun

J'exécute la requête suivante dans notre base de données et j'essaie d'obtenir la valeur de comptage comme 0 si aucun n'est présent, mais avoir des problèmes de le faire. Est-ce que quelqu'un pourrait aider à aider et à expliquer comment accomplir ce xxx

par exemple, ma requête renvoie actuellement quelque chose de retour comme celui-ci xxx

quand je vouloir qu'il retourne les valeurs vides et ressemble à ceci xxx


6 commentaires

Y a-t-il une autre table qui possède tous les valeurs de l'état valides que vous souhaitez apparaître dans votre résultat?


Malheureusement, cela n'est pas limité à cette table. J'ai fait des recherches avant de poster et je sais que je pourrais faire cela avec une jointure à gauche si c'était. Je suis une sorte de creuser comment je peux le faire sans cela.


Comment savez-vous quels valeurs que vous souhaitez apparaître dans le résultat final, alors? Si voip_phone_number_pool a toutes les valeurs d'état, juste pas avec Status = 3 , vous pouvez faire l'auto-join que @Littlefoot suggère. Mais cela va être très coûteux en supposant qu'il s'agisse d'une table raisonnable.


Il n'y a pas une chose comme un déjeuner gratuit, @Justin :)


@Littlefoot - Totalement accepté. À moins que les volumes de données soient vraiment bizarres, je préférerais tout cependant créer une nouvelle table d'état pour que vous souhaitiez les lignes souhaitées. En particulier si la grande table de fait comporte des problèmes de qualité des données (j'ai vu de nombreux systèmes ayant des données pour 70 ou 80 des 50 États américains :-))


Je suis d'accord, @justin. Le modèle de données semble être faux ; Au moins, la table voip_phone_number_pool n'est pas normalisée. Comme vous l'avez dit, Etat doit être un tableau séparé, référencé à partir du VoIP _... / code>. Oh bien, ma requête n'était qu'un exemple de la façon de "résoudre" ce problème.


3 Réponses :


1
votes

Ceci imite ce que vous avez maintenant:

SQL> with voip_phone_number_pool (state, phone_number, status) as
  2    (select 'AZ', 1234, 3 from dual union all
  3     select 'AZ', 2232, 3 from dual union all
  4     select 'AZ', 4444, 3 from dual union all
  5     select 'AZ', 7756, 1 from dual union all
  6     --
  7     select 'CA', 9999, 1 from dual
  8    ),
  9  states as
 10    (select distinct state from voip_phone_number_pool)
 11  select s.state,
 12         count(v.phone_number)
 13  from states s left join voip_phone_number_pool v on v.state = s.state 
 14                                                  and v.status = 3
 15  group by s.state
 16  order by s.state;

ST COUNT(V.PHONE_NUMBER)
-- ---------------------
AZ                     3
CA                     0

SQL>


1 commentaires

Oui, je pense que je vais devoir faire cela, merci d'avoir aidé avec elle.



0
votes

S'il n'y a pas de lignes dans la table des faits (VoIP_Phone_Number_pool) avec un état particulier, vous n'obtiendrez que de ne pas interroger ce tableau.

Vous devrez rejoindre votre table de fait dans une table de dimension (A Tableau avec tous les états possibles) afin d'obtenir les comptes désirés.

Par exemple, en supposant que vous disposez d'une telle table de dimension et qu'elle s'appelle "state_info": xxx


2 commentaires

Si la table des faits n'existe pas, créez-en une à l'aide d'une expression de table commune: avec State_Info comme (Sélectionnez «Al 'comme État de Dual Union Tous Sélectionnez« AK »comme État de Dual Union ...... Sélectionnez' Wy ' En tant que State de Dual) Sélectionnez S.State, Compter (V.Phone_Number) en tant que téléphone_number_count de State_info S Rejoindre externe VoIP_Phone_Number_Pool V sur S.State = V.State Group par S.State;


Merci, j'ai fini par créer une colonne dans l'une de nos tableaux pour suivre les états par et qui fonctionnait



0
votes
     SELECT s.state,
            COUNT(v.phone_number) AS phone_number_count
       FROM CORP_ACCT s
       LEFT OUTER JOIN voip_phone_number_pool v
            ON s.state = v.state
   GROUP BY s.state; 
worked for me

0 commentaires