compter le nombre d'occurrence

compter le nombre d'occurrence - SQL/NoSQL - Programmation

Marsh Posté le 06-12-2007 à 11:34:58    

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

Reply

Marsh Posté le 06-12-2007 à 11:34:58   

Reply

Marsh Posté le 06-12-2007 à 11:40:55    

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
Reply

Marsh Posté le 06-12-2007 à 11:45:14    

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
Reply

Marsh Posté le 06-12-2007 à 11:47:09    

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

Reply

Marsh Posté le 06-12-2007 à 11:51:53    

ça fonctionne, merci :jap:

Reply

Marsh Posté le 06-12-2007 à 11:55:19    

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
Reply

Marsh Posté le 06-12-2007 à 12:03:07    

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

Reply

Marsh Posté le 06-12-2007 à 12:04:14    

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

Reply

Marsh Posté le 06-12-2007 à 12:10:59    

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

Reply

Marsh Posté le 06-12-2007 à 14:58:48    

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

Reply

Marsh Posté le 06-12-2007 à 14:58:48   

Reply

Marsh Posté le 06-12-2007 à 15:02:57    

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

Reply

Marsh Posté le 06-12-2007 à 15:21:27    

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
Reply

Marsh Posté le 06-12-2007 à 15:26:08    

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

Reply

Marsh Posté le 06-12-2007 à 15:37:28    

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' ...

Reply

Marsh Posté le 06-12-2007 à 15:40:15    

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

Reply

Marsh Posté le 06-12-2007 à 15:44:55    

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 ?

Reply

Marsh Posté le 06-12-2007 à 15:45:57    

j'en doute

Reply

Marsh Posté le 06-12-2007 à 16:43:39    

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
Reply

Marsh Posté le 06-12-2007 à 17:38:04    

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

Reply

Marsh Posté le 06-12-2007 à 18:12:09    

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
Reply

Marsh Posté le 06-12-2007 à 20:25:26    

ok je te crois :o
 
:D

Reply

Marsh Posté le 07-12-2007 à 14:21:56    

| 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 ?
 
 
 
 

Reply

Marsh Posté le 07-12-2007 à 14:38:17    

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

Reply

Marsh Posté le 07-12-2007 à 14:59:20    

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
 

Reply

Marsh Posté le 07-12-2007 à 15:33:29    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed