Requête union et sum()

Bonjour !

J’espère que vous pourrez m’aider car je ne trouve rien de bien précis en ce qui concerne mon problème.

Voilà, Je fais beaucoup de requête SQL et bien souvent je suis dans l’obligation de traiter le résultat via un tableau croisé dynamique dans Excel pour regrouper tout cela car je n’arrive pas à “aligner” mes résultats dans ma requête.

Comme je pense que ce n’est pas clair, voici un exemple concret :


SELECT societe, SUM(ca_client), 0, 0
WHERE annee = 2008
GROUP BY societe

UNION

SELECT societe, 0, SUM(ca_client), 0
WHERE annee = 2009
GROUP BY societe

UNION

SELECT societe, 0, 0, SUM(ca_client)
WHERE annee = 2010
GROUP BY societe
ORDER BY societe

Aujourd’hui ce code va me donner 3 lignes à chaque fois : 1 par année. Moi je voudrai une seule ligne avec la somme de 2008, 2009 et 2010.

D’où ma question : est-ce possible ?
Si oui, où je me plante ?

Merci
Edité le 25/10/2010 à 15:53

Déjà, pour éviter une requête visuellement lourde à lire :

SELECT societe, annee, SUM(ca_client)
where annee between 2008 and 2010
GROUP BY societe, annee

Ensuite, vire le group by societe et tu n’auras que trois lignes pour tes 3 années.

:hello: Sans-nom !

Merci de ta réponse, mais cela ne correspond pas à ce que je veux, ou alors j’ai encore fait mon boulet et j’ai rien compris.

En fait si je n’ai pas utiliser de Between ou de >= ; <= c’est parceque je n’arrive pas non plus à avoir mon résultat.

Avec les requêtes ci-dessus j’obtiens par exemple ceci :

Ma requête :

La même avec un between et affichage de l’année :

Alors qu’en fait je voudrai un truc de ce genre la :

Je sais pas si c’est plus clair, ni si on peut le faire.

techniquement c’est possible, mais cela va donner des requêtes imbriqués dans la 1ére (ce qui n’est pas très optimal), alors soit tu peux le faire dans un boucle pour avoir plusieurs appel léger (je sais pas si ta requête s’effectue dans un script ou si c’est juste une requête que tu affiches directement), ce qui me semble plus intéressant soit il te faut absolument une seule requête et cela donne un truc du genre :

SELECT societe s, 
   (SELECT SUM(ca_client) WHERE annee = 2008 AND societe = s GROUP BY societe) CA08,
   (SELECT SUM(ca_client) WHERE annee = 2009 AND societe = s GROUP BY societe) CA09,
   (SELECT SUM(ca_client) WHERE annee = 2010 AND societe = s GROUP BY societe) CA10

Beurk!!! Que c’est pas propre comme code!!! Mais cela doit fonctionner mais si le contenue de tes tables est conséquent cela va être hyper lent et lourd

Effectivement, tu voulais les données en colonne, pas en ligne.

Mais vu que tu utilises Excel, tu pourrais très bien envisager de faire une transposée de ton ResultSet, et du coup, ça reviendrai plus ou moins au même.

Effectivement c’est pas très jojo ^^

Pour info j’utilise soit SQL-View, soit directement des requêtes via Microsoft Query dans Excel même. Je crois que la méthode donnée par Sans-Nom est plus optimisée et je continuerai à utiliser les TCD, après tout, c’est pas la mort :smiley:

Merci de votre aide :jap: