Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2616 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  compter le nombre d'occurrence

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

compter le nombre d'occurrence

n°1653685
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 11:34:58  profilanswer
 

salut
 
si j'ai un table comme ceci
 


| G | H |
| a | y |  
| d | x |
| d | x |
| d | y |


 
comment avoir un résultat de select permettant de donner le nombre d'occurence de x pour les éléments de type d ?
 
| G | H |
| a | 0 |  
| d | 2 |
 
select G, count(*)
from table
where H=x
group by G
 
je ne vois pas comment obtenir les 0 avec une requêtes simples

mood
Publicité
Posté le 06-12-2007 à 11:34:58  profilanswer
 

n°1653693
MagicBuzz
Posté le 06-12-2007 à 11:40:55  profilanswer
 

quel sgbd ?
 

Code :
  1. SELECT G, sum(case H when 'x' then 1 else 0 end)
  2. FROM TABLE
  3. GROUP BY G


 
Tu dois pouvoir aussi le aussi avec une auto-jointure externe.


Message édité par MagicBuzz le 06-12-2007 à 11:41:11
n°1653697
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 11:45:14  profilanswer
 

DB2  [:manust]  
 
en 5 ans de cursus de fac j'ai tout vu sauf les conditonnels de ce genre "case H when 'x' then 1 else 0 end" [:ddr555]


Message édité par basketor63 le 06-12-2007 à 11:45:42
n°1653699
MagicBuzz
Posté le 06-12-2007 à 11:47:09  profilanswer
 

Je sais pas si elles marchent sous DB2 par contre.
Marche sous SQL Server et MySQL, mais je ne crois pas que ce soit du standard SQL.
 
Sous Oracle c'est la fonction DECODE() qui permet de reproduire le même comportement. Sous DB2, aucune idée, mais il y a forcément un équivalent ;)

n°1653705
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 11:51:53  profilanswer
 

ça fonctionne, merci :jap:

n°1653707
MagicBuzz
Posté le 06-12-2007 à 11:55:19  profilanswer
 

La solution avec auto-jointure :

Code :
  1. CREATE TABLE [TABLE]
  2. (
  3.  id numeric PRIMARY KEY,
  4.  G char(1) NOT NULL,
  5.  H char(1) NOT NULL
  6. );
  7.  
  8. INSERT INTO [TABLE] (id, G, H) VALUES (1, 'a', 'y');
  9. INSERT INTO [TABLE] (id, G, H) VALUES (2, 'd', 'x');
  10. INSERT INTO [TABLE] (id, G, H) VALUES (3, 'd', 'x');
  11. INSERT INTO [TABLE] (id, G, H) VALUES (4, 'd', 'y');
  12.  
  13. SELECT t1.G, count(t2.H)
  14. FROM [TABLE] t1
  15. LEFT OUTER JOIN [TABLE] t2 ON t2.id = t1.id AND t2.H = 'x'
  16. GROUP BY t1.G;
  17.  
  18. DROP TABLE [TABLE];


Message édité par MagicBuzz le 06-12-2007 à 11:57:20
n°1653709
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 12:03:07  profilanswer
 

là je pense pas que ça puisse te renvoyer un résultat pouvant être zéro pour le count

n°1653711
MagicBuzz
Posté le 06-12-2007 à 12:04:14  profilanswer
 

ben si...
 
si je t'ai mis le code entier, c'est que j'ai testé avant de poster :o

n°1653713
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 12:10:59  profilanswer
 

ah ok le count compte pas les occurences nulles d'un champ :o

n°1653870
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 14:58:48  profilanswer
 

et si je veux un champ qui dit indique 'oui' si la valeur est plus grande que  0 et non si =0 comment faire sans méthode avec autojointure ?
 
l'autojointure est injouable dans mon cas car en fait il y a au moins 4 jointures de tables pour relier les colones A et B

mood
Publicité
Posté le 06-12-2007 à 14:58:48  profilanswer
 

n°1653873
MagicBuzz
Posté le 06-12-2007 à 15:02:57  profilanswer
 

Ben... Spa compliqué pourtant :o
 

Code :
  1. declare @val AS numeric;
  2. SET @val = 1;
  3. SELECT case when @val > 2 then 'oui' when @val < 2 then 'non' else 'grmpf' end;
  4. SET @val = 2;
  5. SELECT case when @val > 2 then 'oui' when @val < 2 then 'non' else 'grmpf' end;
  6. SET @val = 3;
  7. SELECT case when @val > 2 then 'oui' when @val < 2 then 'non' else 'grmpf' end;


 


 
-----
non
 
(1 ligne(s) affectée(s))
 
 
-----
grmpf
 
(1 ligne(s) affectée(s))
 
 
-----
oui
 
(1 ligne(s) affectée(s))
 

n°1653884
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 15:21:27  profilanswer
 

c'est pas ça je veux obtenir ça  :

 

| G | question |
| a | non |
| d | oui |

 

je vois comment faire en refasant un second select par dessus, mais sinon je vois pas comment lui faire dire d'affichier un résultat dépendant de la somme


Message édité par basketor63 le 06-12-2007 à 15:25:03
n°1653886
anapajari
s/travail/glanding on hfr/gs;
Posté le 06-12-2007 à 15:26:08  profilanswer
 

bin re avec un case :)

Code :
  1. SELECT G, case when sum(case H when 'x' then 1 else 0 end) > 0 then 'oui' else 'non' end AS question
  2.      FROM TABLE
  3.      GROUP BY G

n°1653893
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 15:37:28  profilanswer
 

putain mais quel boulet [:prozac]
 
je tentais un :
 
case sum(case H when 'x' then 1 else 0 end) when 0 then 'non' else 'oui' ...

n°1653895
MagicBuzz
Posté le 06-12-2007 à 15:40:15  profilanswer
 

ceci dit, je ne vois pas trop pourquoi ça marche pas avec ce que tu tentais, ça me semble revenir au même...

n°1653903
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 15:44:55  profilanswer
 

benh si t'es motive essaye cette forme avec ton exemple :D
 
si par exemple je veux que l'expression "sum(case H when 'x' then 1 else 0 end)" ne soit évaluée qu'une fois, si par exemple je veux à la fois une colone avec oui et non et une autre avec la valeur, est ce possible simplement ?

n°1653907
MagicBuzz
Posté le 06-12-2007 à 15:45:57  profilanswer
 

j'en doute

n°1653980
anapajari
s/travail/glanding on hfr/gs;
Posté le 06-12-2007 à 16:43:39  profilanswer
 

basketor63 a écrit :

benh si t'es motive essaye cette forme avec ton exemple :D


cette forme marche aussi, DB2 supportant les deux écritures:

Code :
  1. case monChamps when valeur1 then res1 when valeur2 then res2 else res3 end
  2. -- ou
  3. case when monChamps = valeur1 then res1 when monChamps=valeur2 then res2 else res3 end


Les deux ayant leur avantages ( forme 1 simple à lire, forme 2 possiblité de faire des machins de la mort en y mettant des tests à base de requête par exemple).
Donc tu t'es merdé :o

 
basketor63 a écrit :

si par exemple je veux que l'expression "sum(case H when 'x' then 1 else 0 end)" ne soit évaluée qu'une fois,


Que veux tu dire par "évaluée qu'une fois"??? J'ai comme un vague doute là ...

basketor63 a écrit :

si par exemple je veux à la fois une colone avec oui et non et une autre avec la valeur, est ce possible simplement ?


Code :
  1. SELECT
  2. G
  3. ,case when sum(case H when 'x' then 1 else 0 end) > 0 then 'oui' else 'non' end AS question
  4. ,sum(case H when 'x' then 1 else 0 end) AS nb
  5. FROM TABLE
  6. GROUP BY G


:??:


Message édité par anapajari le 06-12-2007 à 16:43:53
n°1654041
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 17:38:04  profilanswer
 

benh là la somme est calculée 2 fois, une fois pour chaque colone

n°1654046
anapajari
s/travail/glanding on hfr/gs;
Posté le 06-12-2007 à 18:12:09  profilanswer
 

euh non ... :)
Il va y avoir un prefetch de sum qui sera ré-utilisé dans les deux colonnes.
Tu peux le vérifier en faisant un petit explain de ta requete (db2expln)


Message édité par anapajari le 06-12-2007 à 18:12:18
n°1654131
basketor63
LFI et le PC ne sont pas d'EG
Posté le 06-12-2007 à 20:25:26  profilanswer
 

ok je te crois :o
 
:D

n°1654513
basketor63
LFI et le PC ne sont pas d'EG
Posté le 07-12-2007 à 14:21:56  profilanswer
 

| G | H | I |
| a | x | o |
| a | y | o |
| a | z | u |
| a | w | u |
| b | x | o |
| b | y | o |
| b | z | u |
| b | w | u |
 
comment faire là par contre pour avoir le nombre d'élément de la colone H ayant le type I pour chaque type d'élément de la colonne G ?
 
 
 
 

n°1654524
basketor63
LFI et le PC ne sont pas d'EG
Posté le 07-12-2007 à 14:38:17  profilanswer
 

putain c pourrit les vues materialisée dans DB2 [:prozac]
y a un plein de contraintes

n°1654545
anapajari
s/travail/glanding on hfr/gs;
Posté le 07-12-2007 à 14:59:20  profilanswer
 

basketor63 a écrit :

|comment faire là par contre pour avoir le nombre d'élément de la colone H ayant le type I pour chaque type d'élément de la colonne G ?


Pas compris la différence avec la 1ere requête ... pas compris tout court en fait ...
 

basketor63 a écrit :

putain c pourrit les vues materialisée dans DB2 [:prozac]
y a un plein de contraintes


euh [:w3c compliant][:w3c compliant][:w3c compliant]
Nan hein... les vues matérialisées c'est ultra-performant ... à condition de savoir s'en servir :o
 

n°1654612
basketor63
LFI et le PC ne sont pas d'EG
Posté le 07-12-2007 à 15:33:29  profilanswer
 

anapajari a écrit :

Pas compris la différence avec la 1ere requête ... pas compris tout court en fait ...

 

le problème c'est qu'il me compte des doublons

 

par exemple j'ai une table de domaines, une table d'abonnements, et une table de sociétés

 

domaines <--> abonnements <---> societés

 

je veux savoir combien chaque domaine possède de societés dont le type est X

 

select domaines.nom, sum(case societe.type when 'X' then 1 else 0 end)
from domaines, abonnements, societés
where domaines.iddomaine=abonnements.iddomaine
      and abonnements.idsociete=societés.idsociete
group by domaines.iddomaine, societe.idsociete

 

le probleme c'est que lorsqu'il existe plusieurs abonnements sur la même société, il va me compter la société autant de fois qu'elle apparait dans des abonnements liés au domaine

 

pourtant à l'affichage sur la même requete avec un select domaines.nom,societe.id il ne m'affiche pas les doublons de société, mais avec le sum pourtant il les compte

 

je vois pas ou je pourrais coller un distinct là dedans, et vous ?

 
anapajari a écrit :

euh [:w3c compliant][:w3c compliant][:w3c compliant]
Nan hein... les vues matérialisées c'est ultra-performant ... à condition de savoir s'en servir :o

 

benh oui c'est bien, mais là DB2 accepte pas le "case when" sur un refresh immediate ou un refresh immediate avec stagging table j'ai l'impression vu les message d'erreurs


Message édité par basketor63 le 07-12-2007 à 15:48:41
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  compter le nombre d'occurrence

 

Sujets relatifs
erreur code jeu de nombre[SQL] Afficher un certain nombre de donnée dans 1 ligne d'un tableau
[BATCH] Nombre de fichier ??Mysqli bind_param sur nombre de paramètres variable
[Résolu] explode(): connaitre le nombre de donnée dans une variableSQL oracle erreur nombre invalide
Nombre avec virgule dans bddDébutant inside : Problème de 0 à gauche dans un nombre.
Comment faire un total de nombre trouver par script[Javascript] Est-ce un nombre?
Plus de sujets relatifs à : compter le nombre d'occurrence


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR