viking: 2 sql Abfragen kombinieren

Servus, hoffe jemand kann mir auf die Sprünge helfen. Ich hab 2 SQL Abfragen die einzeln wunderbar funktionieren. Nun möchte ich diese so kombinieren, dass sie in der selben Tabelle ausgegeben werden.

SELECT projectteam_id, SUM( value*2 ) AS 2er  
FROM jos_joomleague_match_statistic  
WHERE statistic_id =3  
GROUP BY projectteam_id  
LIMIT 0 , 30
SELECT projectteam_id, SUM( value*5 ) AS 5er  
FROM jos_joomleague_match_statistic  
WHERE statistic_id =4  
GROUP BY projectteam_id  
LIMIT 0 , 30

Kann jemand behilflich sein? Das Resultat sollte zum Beispiel so sein:

projectteam_id | 2er | 5er
1              |  50 | 12
2              |  18 | 28
3
..

Gruss & Danke

Jan

  1. Hallo!

    SELECT projectteam_id, SUM( value*2 ) AS 2er, SUM( value*5 ) AS 5er  
    FROM jos_joomleague_match_statistic  
    WHERE statistic_id =3  
    GROUP BY projectteam_id  
    LIMIT 0 , 30
    

    Grüße, Matze

  2. Hi,

    SELECT projectteam_id, SUM( value*2 ) AS 2er

    FROM jos_joomleague_match_statistic
    WHERE statistic_id =3
    GROUP BY projectteam_id
    LIMIT 0 , 30

    
    >   
    > ~~~sql
    
    SELECT projectteam_id, SUM( value*5 ) AS 5er  
    
    > FROM jos_joomleague_match_statistic  
    > WHERE statistic_id =4  
    > GROUP BY projectteam_id  
    > LIMIT 0 , 30
    
    

    Kann jemand behilflich sein? Das Resultat sollte zum Beispiel so sein:

    projectteam_id | 2er | 5er
    1              |  50 | 12
    2              |  18 | 28
    3

    Ne, so sollte das Resultat auf keinen Fall aussehen, denn SUM( value*5 ) AS 5er kann nur Werte ergeben, die durch 5 teilbar sind ... ;-)

    Das WHERE muß natürlich aufgebohrt werden, damit sowoh 3 als auch 4 erlaubt ist, also IN (3, 4).

    Damit für die 2er nur die passenden Werte (statistic_id = 3) gezählt werden, sollte der value noch mit 1 (falls statistic_id = 3) bzw. 0 (fallst statistic_id nicht 3) multipliziert werden.
    Die meisten DB-Systeme kennen eine IF-Funktion oder ähnliches. Du verrätst ja nicht, welches Du benutzt.

    Also in etwa so:

    SUM( value*5*IF(statisitic_id=3;1;0) ) AS 2er

    Genaue Syntax für IF verrät Dir das Handbuch Deines DB-Systems.

    Für die 5er analog, mit statistic_id = 4, als zusätzliche Spalte beim select.

    Ob Du das LIMIT (ok, Oracle benutzt Du nicht ...) auf 60 erhöhen willst, mußt Du selbst wissen.

    (übrigens: mir kommt das LIMIT ohne ORDER BY verdächtig vor ...)

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Ne, so sollte das Resultat auf keinen Fall aussehen, denn SUM( value*5 ) AS 5er kann nur Werte ergeben, die durch 5 teilbar sind ... ;-)

      Stimmt ;)

      Das WHERE muß natürlich aufgebohrt werden, damit sowoh 3 als auch 4 erlaubt ist, also IN (3, 4).

      Damit für die 2er nur die passenden Werte (statistic_id = 3) gezählt werden, sollte der value noch mit 1 (falls statistic_id = 3) bzw. 0 (fallst statistic_id nicht 3) multipliziert werden.
      Die meisten DB-Systeme kennen eine IF-Funktion oder ähnliches. Du verrätst ja nicht, welches Du benutzt.

      Also in etwa so:

      SUM( value*5*IF(statisitic_id=3;1;0) ) AS 2er

      Genaue Syntax für IF verrät Dir das Handbuch Deines DB-Systems.

      Für die 5er analog, mit statistic_id = 4, als zusätzliche Spalte beim select.

      Ob Du das LIMIT (ok, Oracle benutzt Du nicht ...) auf 60 erhöhen willst, mußt Du selbst wissen.

      Habs nun so versucht:

      SELECT projectteam_id, SUM( value*2*IF(statistic_id=3,1,0) ) AS 2er, SUM( value*5*IF(statistic_id=4,1,0) ) AS 5er  
      FROM jos_joomleague_match_statistic  
      WHERE statistic_id =(3,4)  
      GROUP BY projectteam_id
      

      Bekomme nun aber folgenden Fehler:#1241 - Operand should contain 1 column(s)

      Was hat es damit auf sich?

      Gruss Jan

      1. SELECT projectteam_id, SUM( value *2 * IF( statistic_id =3, 1, 0 ) ) AS 2er , SUM( value *5 * IF( statistic_id =4, 1, 0 ) ) AS 5er , SUM( value *10 * IF( statistic_id =7, 1, 0 ) ) AS 10er , SUM( value *20 * IF( statistic_id =8, 1, 0 ) ) AS 20er , SUM( value *25 * IF( statistic_id =9, 1, 0 ) ) AS 5er  
        FROM jos_joomleague_match_statistic  
        GROUP BY projectteam_id  
        
        

        Geschafft, Danke fürs auf den richtigen Weg führen!

        1. Hi,

          Geschafft, Danke fürs auf den richtigen Weg führen!

          Gut! Und auch Dir ein Danke, daß Du die fertige Lösung auch präsentierst - das hilft dann späteren Archiv-Suchern.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      2. Hi,

        Das WHERE muß natürlich aufgebohrt werden, damit sowoh 3 als auch 4 erlaubt ist, also IN (3, 4).

        WHERE statistic_id =(3,4)

        Da ist was falsch, hab doch extra das IN hingeschrieben ...

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  3. Moin,

    SELECT  
         A.projectteam_id  
         , SUM( A.value*2 ) AS 2er  
         , SUM( B.value*5 ) AS 5er  
    FROM jos_joomleague_match_statistic AS A  
    JOIN jos_joomleague_match_statistic AS B ON  
         B.projectteam_id = A.projectteam_id  
         AND B.statistic_id = 4  
    WHERE statistic_id = 3  
    GROUP BY projectteam_id  
    LIMIT 0 , 30
    

    (ungetestet)

    Grüße Marco

    --
    Ich spreche Spaghetticode - fließend.
    1. Hi,

      SELECT

      A.projectteam_id
           , SUM( A.value2 ) AS 2er
           , SUM( B.value
      5 ) AS 5er
      FROM jos_joomleague_match_statistic AS A
      JOIN jos_joomleague_match_statistic AS B ON
           B.projectteam_id = A.projectteam_id
           AND B.statistic_id = 4
      WHERE statistic_id = 3
      GROUP BY projectteam_id
      LIMIT 0 , 30

        
      Wenn ich das richtig sehe, werden dann projectteams, für die es keine Zeile mit statistic\_id=3 gibt (sondern nur eine mit statistic\_id=4), gar nicht berücksichtigt.  
        
      (im WHERE/GROUP BY müßte m.E. auch noch der jeweilige Tabellen-Alias mit dazu.)  
        
      cu,  
      Andreas
      
      -- 
      [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
      [O o ostern ...](http://ostereier.andreas-waechter.de/)  
        
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.  
      
      
      1. Moin,

        Wenn ich das richtig sehe, werden dann projectteams, für die es keine Zeile mit statistic_id=3 gibt (sondern nur eine mit statistic_id=4), gar nicht berücksichtigt.
        (im WHERE/GROUP BY müßte m.E. auch noch der jeweilige Tabellen-Alias mit dazu.)

        Stimmt. Man könnte die eigentliche Abfrage nur auf die Projektteams einschränken und mit 2 Joins (jeweils für id 3 und 4) arbeiten. Die Aliases in WHERE/GROUP BY hatte ich schlicht vergessen. In so einer 2-Join-Variante könnte man sich durch DISTINCT auch das GROUP BY sparen.

        SELECT  
             DISTINCT Basis.projectteam_id  
             , SUM( A.value*2 ) AS 2er  
             , SUM( B.value*5 ) AS 5er  
        FROM jos_joomleague_match_statistic AS Basis  
        LEFT JOIN jos_joomleague_match_statistic AS A ON  
             A.projectteam_id = Basis.projectteam_id  
             AND A.statistic_id = 3  
        LEFT JOIN jos_joomleague_match_statistic AS B ON  
             B.projectteam_id = Basis.projectteam_id  
             AND B.statistic_id = 4  
        LIMIT 0 , 30
        

        (auch ungetestet)

        Grüße Marco

        --
        Ich spreche Spaghetticode - fließend.
        1. Stimmt. Man könnte die eigentliche Abfrage nur auf die Projektteams einschränken und mit 2 Joins (jeweils für id 3 und 4) arbeiten. Die Aliases in WHERE/GROUP BY hatte ich schlicht vergessen. In so einer 2-Join-Variante könnte man sich durch DISTINCT auch das GROUP BY sparen.

          SELECT

          DISTINCT Basis.projectteam_id
               , SUM( A.value2 ) AS 2er
               , SUM( B.value
          5 ) AS 5er
          FROM jos_joomleague_match_statistic AS Basis
          LEFT JOIN jos_joomleague_match_statistic AS A ON
               A.projectteam_id = Basis.projectteam_id
               AND A.statistic_id = 3
          LEFT JOIN jos_joomleague_match_statistic AS B ON
               B.projectteam_id = Basis.projectteam_id
               AND B.statistic_id = 4
          LIMIT 0 , 30

          
          > (auch ungetestet)  
          >   
          > Grüße Marco  
            
          Wow erstmal danke für die Hilfe, das übersteigt meine Kenntnisse. Wo genau hast du nun definiert, dass nur projectteam\_id 2 abgefragt wird? Hab's kurz ausprobiert erhalte aber (wohl) noch nicht das gewünschte. AUsgegeben wird nun folgendes:  
            
          projectteam\_id |  2er   | 5er|  
          2              | 230364 |NULL|  
            
          Die NULL stimmt, da beim Team 2 keine Werte mit statistic\_id = 4 existieren. Der Wert für 2er also statistic\_id = 3 ist allerdings viel zu hoch. Da dürften nur 106 stehen.  
            
            
            
          
          
          1. Moin,

            Wow erstmal danke für die Hilfe, das übersteigt meine Kenntnisse. Wo genau hast du nun definiert, dass nur projectteam_id 2 abgefragt wird?

            Gar nicht. Das hast du aber auch nicht, wenn ich nicht total blind bin. Kann man aber natürlich noch einfügen.

            Hab's kurz ausprobiert erhalte aber (wohl) noch nicht das gewünschte. AUsgegeben wird nun folgendes:
            projectteam_id |  2er   | 5er|
            2              | 230364 |NULL|
            Die NULL stimmt, da beim Team 2 keine Werte mit statistic_id = 4 existieren. Der Wert für 2er also statistic_id = 3 ist allerdings viel zu hoch. Da dürften nur 106 stehen.

            Hm. Das kann verschiedene Gründe haben. Du kannst zum Debuggen mal die Summe und das DISTINCT weglassen und so sehen, welche Datensätze er dort heranzieht. Außerdem hielt ich auch die Multiplikation mit 2 innerhalb der Summe für komisch. Welche Bedeutung hat das genau?

            Grüße Marco

            --
            Ich spreche Spaghetticode - fließend.
            1. Moin,

              Wow erstmal danke für die Hilfe, das übersteigt meine Kenntnisse. Wo genau hast du nun definiert, dass nur projectteam_id 2 abgefragt wird?

              Gar nicht. Das hast du aber auch nicht, wenn ich nicht total blind bin. Kann man aber natürlich noch einfügen.

              Nein hatte ich nicht und will ich eigentlich auch nicht, aber jetzt wird mir nur noch diese Zeile angezeigt, daher dachte ich zuerst daran.

              Hab's kurz ausprobiert erhalte aber (wohl) noch nicht das gewünschte. AUsgegeben wird nun folgendes:
              projectteam_id |  2er   | 5er|
              2              | 230364 |NULL|
              Die NULL stimmt, da beim Team 2 keine Werte mit statistic_id = 4 existieren. Der Wert für 2er also statistic_id = 3 ist allerdings viel zu hoch. Da dürften nur 106 stehen.

              Hm. Das kann verschiedene Gründe haben. Du kannst zum Debuggen mal die Summe und das DISTINCT weglassen und so sehen, welche Datensätze er dort heranzieht. Außerdem hielt ich auch die Multiplikation mit 2 innerhalb der Summe für komisch. Welche Bedeutung hat das genau?

              Es handelt sich hierbei um die Statistik der Strafminuten. Statistic_id=3 sind die Zweiminutenstrafen, daher multiplizier ich die Anzahl mit 2 um auf die totale Anzahl Strafminuten zu kommen, statistic_id=4 sind Fünfminutenstrafen etc...

              Hab mal die Summe weggelassen, dabei seh ich dass mehrfache Werte nur einmal pro Team rausgezogen werden, was zwar auch nicht gewollt ist, das Rätsel um die Riesenzahl aber noch nicht löst.

              Gruss Jan

              1. Moin,

                Nein hatte ich nicht und will ich eigentlich auch nicht, aber jetzt wird mir nur noch diese Zeile angezeigt, daher dachte ich zuerst daran.

                Achso. Das ist komisch.

                Es handelt sich hierbei um die Statistik der Strafminuten. Statistic_id=3 sind die Zweiminutenstrafen, daher multiplizier ich die Anzahl mit 2 um auf die totale Anzahl Strafminuten zu kommen, statistic_id=4 sind Fünfminutenstrafen etc...

                Aha. Das Ergibt natürlich Sinn.

                Hab mal die Summe weggelassen, dabei seh ich dass mehrfache Werte nur einmal pro Team rausgezogen werden, was zwar auch nicht gewollt ist, das Rätsel um die Riesenzahl aber noch nicht löst.

                Das ist sicherlich ein Distinct-Problem. Lass mal das Distinct-Schlüsselwort weg und nehme Basis.projectteam_id in die GROUP BY Klausel mit rein:

                SELECT  
                     Basis.projectteam_id  
                     , SUM( A.value*2 ) AS 2er  
                     , SUM( B.value*5 ) AS 5er  
                FROM jos_joomleague_match_statistic AS Basis  
                LEFT JOIN jos_joomleague_match_statistic AS A ON  
                     A.projectteam_id = Basis.projectteam_id  
                     AND A.statistic_id = 3  
                LEFT JOIN jos_joomleague_match_statistic AS B ON  
                     B.projectteam_id = Basis.projectteam_id  
                     AND B.statistic_id = 4  
                GROUP BY Basis.projectteam_id  
                LIMIT 0 , 30
                

                Ansonsten könntest du auch mal versuchen das LIMIT wegzulassen.

                Grüße Marco

                --
                Ich spreche Spaghetticode - fließend.
                1. Das ist sicherlich ein Distinct-Problem. Lass mal das Distinct-Schlüsselwort weg und nehme Basis.projectteam_id in die GROUP BY Klausel mit rein:

                  SELECT

                  Basis.projectteam_id
                       , SUM( A.value2 ) AS 2er
                       , SUM( B.value
                  5 ) AS 5er
                  FROM jos_joomleague_match_statistic AS Basis
                  LEFT JOIN jos_joomleague_match_statistic AS A ON
                       A.projectteam_id = Basis.projectteam_id
                       AND A.statistic_id = 3
                  LEFT JOIN jos_joomleague_match_statistic AS B ON
                       B.projectteam_id = Basis.projectteam_id
                       AND B.statistic_id = 4
                  GROUP BY Basis.projectteam_id
                  LIMIT 0 , 30

                  
                  > Ansonsten könntest du auch mal versuchen das LIMIT wegzulassen.  
                  >   
                  
                  Dankeschön, jetzt sind wieder alle projectteams vorhanden! Was jetzt noch bleibt sind die viel zu grossen Werte die noch bestehen. Limit lass ich immer weg, aber phpmyadmin schreibts bei der Ausgabe jeweils wieder dazu und ich hatte die Ausgabe kopiert.  
                    
                  
                  
                  1. Hab mal die beiden AND Bedingungen weggelassen, nun bekomm ich Werte in Millionenhöhe was noch weniger Sinn macht. Kann es sein, dass es irgendwo an dieser Bedingung hängt?

                    Gruss Jan

                    1. Moin,

                      Hab mal die beiden AND Bedingungen weggelassen, nun bekomm ich Werte in Millionenhöhe was noch weniger Sinn macht. Kann es sein, dass es irgendwo an dieser Bedingung hängt?

                      Wie ist denn die Tabelle aufgebaut? Welche Felder gibt es noch? Und wie viele Datensätze sind insgesamt darin?

                      Grüße Marco

                      --
                      Ich spreche Spaghetticode - fließend.