Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/12/2011, 10h09   #1
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 78
Points : 12
Points : 12
Par défaut Regrouper plusieurs SELECT

Bonjour,

J'ai plusieurs sélections à faire sur une même table de la sorte :
Code :
1
2
3
4
 
SELECT id,count(*) FROM matable WHERE ... GROUP BY id
SELECT count(*) FROM matable WHERE ... GROUP BY id
...
J'ai toujours le même nombre de lignes retournées et je cherche à regrouper tous ces select dans un seul. Le but étant que chaque select ajouté soit une nouvelle colonne.
J'ai bien lu des choses sur les requêtes imbriquées, les jointures mais je n'y arrive pas ...
Quelle est la solution la plus simple?
merci de votre aide.
apidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 10h14   #2
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 353
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 353
Points : 9 747
Points : 9 747
Merci d'être plus clair, car là on ne sait pas trop ce que vous comptez obtenir.
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 20/12/2011, 10h24   #3
Membre émérite
 
Homme Tony
Développeur .NET
Inscription : novembre 2010
Messages : 570
Détails du profil
Informations personnelles :
Nom : Homme Tony
Localisation : France

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : novembre 2010
Messages : 570
Points : 821
Points : 821
en DB2 on peut faire ça (je ne sais pas si c'est syntaxe générique ou spécifique à DB2) :

Code :
1
2
3
4
5
6
WITH A AS (SELECT id,count(*) AS count FROM matable WHERE ... GROUP BY id),
B AS (SELECT id, count(*) AS count FROM matable WHERE ... GROUP BY id)
 
SELECT A.id, sum(A.count), sum(B.count)
FROM A INNER JOIN B ON A.id = B.id
GROUP BY A.id, B.id
__________________
Le Porc est un loup pour le Porc.
asmduty est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/12/2011, 10h26   #4
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 922
Points : 1 922
Bonjour,
Pour le faire avec "n'import quelle base", il faut utiliser une UNION.
Mais attention, toutes les requêtes de l'union doivent renvoyer le même nombre de colonne, du même type. Donc avec l'exemple donné, ça ne fonctionne pas...

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 11h19   #5
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 78
Points : 12
Points : 12
Citation:
Envoyé par Bluedeep Voir le message
Merci d'être plus clair, car là on ne sait pas trop ce que vous comptez obtenir.
Relis mon message...c'est pas expliqué en SQL(sinon j'aurai pas posé la question) mais en français !
apidou est déconnecté   Envoyer un message privé Réponse avec citation 03
Vieux 20/12/2011, 11h24   #6
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 78
Points : 12
Points : 12
Citation:
Envoyé par tatayo Voir le message
Bonjour,
Pour le faire avec "n'import quelle base", il faut utiliser une UNION.
Mais attention, toutes les requêtes de l'union doivent renvoyer le même nombre de colonne, du même type. Donc avec l'exemple donné, ça ne fonctionne pas...

Tatayo.
Merci de ta réponse.
D’après ce que j'ai compris, UNION renvoie un ensemble de lignes et moi ce que qu'il me faut, c'est ajouter les enregistrements des requêtes en colonne... En récupérant à chaque requête le Id, on doit pouvoir faire une jointure mais je ne sais écrire un telle requête de façon simple (j'ai 7 requêtes à faire en série sur le même champ).
apidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 11h31   #7
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Citation:
Envoyé par asmduty Voir le message
en DB2 on peut faire ça (je ne sais pas si c'est syntaxe générique ou spécifique à DB2) :
C'est une syntaxe qui est aussi utilisée sous Oracle et qui (il me semble) est générique. Et qui répond au besoin.
Mais il faudrait qu'on connaisse le SGBD utilisé pour répondre correctement à la question !!
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 11h36   #8
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 922
Points : 1 922
Effectivement, disons que je n'avais pas compris la question ...

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 11h44   #9
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 78
Points : 12
Points : 12
Citation:
Envoyé par lola06 Voir le message
C'est une syntaxe qui est aussi utilisée sous Oracle et qui (il me semble) est générique. Et qui répond au besoin.
Mais il faudrait qu'on connaisse le SGBD utilisé pour répondre correctement à la question !!
Il s'agit de POSTGRESQL.
apidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 11h49   #10
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
As-tu essayé la solution proposée par asmduty ?
Je n'ai pas pu trouver si c'était compatible avec ton SGBD. Un test simple pourrait nous le dire...
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 11h54   #11
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT id
      , sum( case when (WHERE 1 ) then 1 else 0 end)
      , sum( case when (WHERE 2 ) then 1 else 0 end)
      , ...
FROM
     matable 
WHERE 
     (WHERE 1 )
  OR (WHERE 2 )
  OR ... 
GROUP BY id
me semble repondre au besoin
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/12/2011, 12h05   #12
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 78
Points : 12
Points : 12
Citation:
Envoyé par lola06 Voir le message
As-tu essayé la solution proposée par asmduty ?
Je n'ai pas pu trouver si c'était compatible avec ton SGBD. Un test simple pourrait nous le dire...
Je viens de tester et cette solution aboutie parfaitement au résultat souhaité.
Merci pour cette démo de syntaxe.

Par contre, c'est assez super lourd à mettre en place (7 requêtes) ... ?
apidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 12h26   #13
Candidat au titre de Membre du Club
 
Inscription : août 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 78
Points : 12
Points : 12
Citation:
Envoyé par Jean.Cri1 Voir le message
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT id
      , sum( case when (WHERE 1 ) then 1 else 0 end)
      , sum( case when (WHERE 2 ) then 1 else 0 end)
      , ...
FROM
     matable 
WHERE 
     (WHERE 1 )
  OR (WHERE 2 )
  OR ... 
GROUP BY id
me semble repondre au besoin
Alors là chapeau bas ...!
Cela fonctionne et c'est très simple à écrire. Je vais noter très précieusement cette syntaxe et retourner dans la doc pour bien comprendre la partie
Code :
sum( case when (WHERE 1 ) then 1 else 0 end)
Merci.
apidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2011, 15h09   #14
Membre confirmé
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 181
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2006
Messages : 181
Points : 267
Points : 267
La partie
Code :
1
2
3
4
5
6
7
FROM
     matable 
WHERE 
     (WHERE 1 )
  OR (WHERE 2 )
  OR ... 
GROUP BY id
est evidement a adapter pour n'avoir que les restrictions les plus larges dans le cas ou les criteres permettront d'utiliser un index.
S'il n'y a pas d'index particulierement discriminant ou si un where n'a pas de condition ( comme le count(*) total de la table ) alors cette partie est inutile
Jean.Cri1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h27.


 
 
 
 
Partenaires

Hébergement Web