compter le nombre d'occurrence - SQL/NoSQL - Programmation
Marsh Posté le 06-12-2007 à 11:40:55
quel sgbd ?
Code :
|
Tu dois pouvoir aussi le aussi avec une auto-jointure externe.
Marsh Posté le 06-12-2007 à 11:45:14
DB2
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"
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
Marsh Posté le 06-12-2007 à 11:55:19
La solution avec auto-jointure :
Code :
|
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
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
Marsh Posté le 06-12-2007 à 12:10:59
ah ok le count compte pas les occurences nulles d'un champ
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
Marsh Posté le 06-12-2007 à 15:02:57
Ben... Spa compliqué pourtant
Code :
|
|
Marsh Posté le 06-12-2007 à 15:21:27
c'est pas ça je veux obtenir ça :
| G | question | |
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
Marsh Posté le 06-12-2007 à 15:26:08
bin re avec un case
Code :
|
Marsh Posté le 06-12-2007 à 15:37:28
putain mais quel boulet
je tentais un :
case sum(case H when 'x' then 1 else 0 end) when 0 then 'non' else 'oui' ...
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...
Marsh Posté le 06-12-2007 à 15:44:55
benh si t'es motive essaye cette forme avec ton exemple
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 ?
Marsh Posté le 06-12-2007 à 16:43:39
basketor63 a écrit : benh si t'es motive essaye cette forme avec ton exemple |
cette forme marche aussi, DB2 supportant les deux écritures:
Code :
|
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é
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 :
|
Marsh Posté le 06-12-2007 à 17:38:04
benh là la somme est calculée 2 fois, une fois pour chaque colone
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)
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 ?
Marsh Posté le 07-12-2007 à 14:38:17
ReplyMarsh 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 |
euh
Nan hein... les vues matérialisées c'est ultra-performant ... à condition de savoir s'en servir
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) |
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 |
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
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