J'ai une table (avec nom 'emplois') ayant des colonnes 'id' et "type". La colonne ID peut avoir la même carte d'identité plus d'une fois et la colonne Type avec deux valeurs disent 'A' et 'B'. Je veux obtenir le nombre de tous les identifiants avec type "A", avec type "B" et avec type "A" et "B" les deux.
J'ai essayé la requête ci-dessous, mais cela donne le nombre de types 'A' et tapez 'B'. P>
Count of IDâs having just A as type: 3 Count of IDâs having just B as type : 4 Count of IDâs having A and B as type : 2
4 Réponses :
Vous pouvez essayer cela. Démo forte> p> p>
@ Kaushik Nayak: A & B sont les valeurs du champ "Type". J'ai juste besoin d'agréger les valeurs basées sur des identifiants. S'il vous plaît vérifier ma sortie attendue.
@palpras: Avez-vous essayé la requête sur vos tables? Quelle sortie avez-vous eu?
@ Kaushik nayak. Merci, je suis capable d'obtenir la sortie requise :)
@ Kaushik Nayak: Est-il réalisable d'obtenir le même résultat sans utiliser le groupe en pensant à la perspective de la rendre plus efficace
@Palpras: Il peut y avoir, mais je ne pense pas qu'ils amélioreraient les performances tout meilleur et groupe par code> est la chose la plus sensible à utiliser lorsque vous avez plusieurs identifiants à l'agrégat. Une option d'accélération de la requête serait d'ajouter un index sur
ID, tapez code>. Vous pouvez poser une question distincte si vous faites face à des problèmes de performance donnant les détails du plan
expliquer code> etc. comme performance dépend de vos données.
J'écrirais cela comme suit: si vous le souhaitez dans des lignes distinctes: p>
en fonction de vos données d'échantillon, ci-dessous fonctionnera comme prévu:
with jobs(id,type) AS ( select 1, 'A' FROM DUAL UNION ALL select 1, 'A' FROM DUAL UNION ALL select 2, 'A' FROM DUAL UNION ALL select 2, 'A' FROM DUAL UNION ALL select 2, 'B' FROM DUAL UNION ALL select 3, 'A' FROM DUAL UNION ALL select 3, 'B' FROM DUAL UNION ALL select 4, 'B' FROM DUAL UNION ALL select 4, 'B' FROM DUAL UNION ALL select 5, 'B' FROM DUAL ) SELECT distinct j1.type||j2.type as type, COUNT( DISTINCT j1.ID ) OVER ( PARTITION BY j1.type||j2.type) AS Count FROM jobs j1 inner join jobs j2 on j1.id = j2.id and j1.type <= j2.type
Obtenez 3 comptoirs différents pour chaque cas:
select 'Count of IDs having just A as type :' descr, count(distinct id) counter from jobs j where ((select max(jobs.type) from jobs where jobs.id = j.id) = 'a') union all select 'Count of IDs having just B as type :' descr, count(distinct id) from jobs j where ((select min(jobs.type) counter from jobs where jobs.id = j.id) = 'b') union all select 'Count of IDs having A and B as type :' descr, count(distinct id) counter from jobs j where ( (select min(jobs.type) from jobs where jobs.id = j.id) = 'a' and (select max(jobs.type) from jobs where jobs.id = j.id) = 'b' );
Je ne reçois pas les résultats escomptés de votre requête
@palpras Il y a 2 démos où vous voyez les résultats escomptés.
Votre question est déroutante. S'il vous plaît ajouter la sortie attendue.
@TimbieGeleisen Sortie est simple comme ci-dessous: Compte de type A: 10 Nombre de type B: 15 Nombre de types A et B: 5 Obtenir le nombre de types 'A' et 'B' est assez simple, je suis confus comment obtenir le Comptez les identifiants dans le tableau ayant des enregistrements pour le type 'A' et le type 'B' séparément
Votre requête est presque correcte pour les 2 premiers cas, je dois réfléchir au 3ème scénario A + B: Sélectionnez le type distinct, le compte (identifiant distinct) sur (partition par type) comme comptage à partir d'emplois