0
votes

Comment regrouper les lignes et obtenir le nombre basé sur d'autres valeurs de colonne dans Oracle

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    


3 commentaires

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


4 Réponses :


0
votes

Vous pouvez essayer cela. xxx

Démo


5 commentaires

@ 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 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 . Vous pouvez poser une question distincte si vous faites face à des problèmes de performance donnant les détails du plan expliquer etc. comme performance dépend de vos données.



0
votes

J'écrirais cela comme suit: xxx

si vous le souhaitez dans des lignes distinctes: xxx


0 commentaires

0
votes

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


0 commentaires

0
votes

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'
  );


2 commentaires

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.