Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SQL] Jointure de deux sum

    10 avril 2011 à 1:19:44

    Bonjour, soir,

    J'ai deux calculs de sommes sur des tables différentes :

    select sum(val) as total_1 from(
    	select count(champ) val from table1 where champ='xxxxx'
    	union all
    	select count(champ) val from table2 where champ='xxxxx'
    )r1
    
    select sum(val) as total_2 from(
    	select count(autre_champ) val from autre_table1 where autre_champ='xxxxx'
    	union all
    	select count(autre_champ) val from autre_table2 where autre_champ='xxxxx'
    )r2
    


    Par soucis d'optimisation, je voudrais savoir comment je puis lier les deux, pour ne faire qu'une seule requête... sans les additionner.

    Par cette requête, je devrais donc recevoir ceci comme résultat :

    | total_1 | total_2 |
    | xxxxxxxxxx | xxxxxxxxxx |

    Quelqu'un pourrait-il me renseigner, svp?
    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2011 à 1:31:57

      Bonjour j'ai cherché en vain l'autre jour et j'ai été obliger de faire deux requetes meme les cadore du fofo BDD non pas pu me renseigner.

      tente ca peut etre mais logiquement ca plante!

      select sum(val) as total_1 from(
      	select count(champ) val from table1 where champ='xxxxx'
      	union all
      	select count(champ) val from table2 where champ='xxxxx'
      ),
       sum(val) as total_2 from(
      	select count(autre_champ) val from autre_table1 where autre_champ='xxxxx'
      	union all
      	select count(autre_champ) val from autre_table2 where autre_champ='xxxxx'
      )
      


      mon post

      http://www.siteduzero.com/forum-83-633 [...] rne-rien.html
      • Partager sur Facebook
      • Partager sur Twitter
        10 avril 2011 à 1:40:49

        Ce que vous cherchez à faire n'a pas de sens. S'il n'y a pas de relation entre les deux tables, faites deux requêtes. Une requête éléphantesque et alambiquée n'est pas plu "optimisée" que deux requêtes simples, élégantes et taillées sur mesures pour leur job.
        • Partager sur Facebook
        • Partager sur Twitter
          10 avril 2011 à 1:43:38

          oui `Haku je suis d'accord avec toi d'ailleur ce fut la solution que j'ai choisie.

          mais bon, j'ai finit avec 20 requetes alors que je pensais en faire une!

          en tout cas ca marche!!

          Micodeur te prend pas la tete fais deux requetes comme moi! Franchement j'ai chercher deux jours pour du vent!!
          • Partager sur Facebook
          • Partager sur Twitter
            10 avril 2011 à 1:55:07

            `Haku> Il y a une raison a cela, chez mon hébergeur, j'ai une limite du nombre de requêtes par heures...

            Le mieux que j'aie pu faire, c'est ceci :


            select * from (
            	select sum(val) as total_1 from(
            		select count(champ) val from table1 where champ='xxxxx'
            		union all
            		select count(champ) val from table2 where champ='xxxxx'
            	)r1
            	union
            	select sum(val) as total_2 from(
            		select count(autre_champ) val from autre_table1 where autre_champ='xxxxx'
            		union all
            		select count(autre_champ) val from autre_table2 where autre_champ='xxxxx'
            	)r2
            )t
            


            Mais ce n'est pas top, à mon goût, puisque, en pdo, je ne peux pas appeler total_1 et total_2


            EDIT : Mes tables concernées ont bien un rapport et je me sers de cette requête pour une même vérification...

            EDIT 2 : En gros, je voudrais simuler un create view qui contiendrait les colonnes total_1 et total_2
            • Partager sur Facebook
            • Partager sur Twitter
              10 avril 2011 à 19:16:32

              1) Ton union tout seul devrait ête union all comme le reste. Si par extraordinaire les valeurs numériques des deux sommes sont identiques, une sera supprimée si tu gardes union
              2)
              select sum(case x
                             when 1 then total_1
                             else 0
                            end) total_1,
                        sum(case x
                              when 2 then total_2
                              else 0
                            end) total_2
              


              à la place du select * et tu rajoutes une colonne x constante qui vaut 1 là où tu calcules total_1 et 2 là ou tu calcules total_2. Comme d'autres l'on souligné, le cas est logiquement assez faiblard, même si cela limite les aller-retours avec la base.
              • Partager sur Facebook
              • Partager sur Twitter

              [SQL] Jointure de deux sum

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown