Ankündigung

Einklappen
Keine Ankündigung bisher.

Komplizierte Summe bilden, bitte um Hilfe

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Komplizierte Summe bilden, bitte um Hilfe

    Guten Tag Community,
    ich habe ein kleines Problem. Ich möchte aus einer Select-Befehl die Summe ziehen.
    Aus meinem Select-Befehl bekomme ich 3 Werte(kann je Abfrage unterschiedlich sein), diese möchte ich addieren. Leider funktioniet der Befehl "with rollup" nicht, da er die Formel (siehe unten (Sum(a.Masse)/Count(*))+Sum(w.Masse) ) mitzieht.

    Kann man über einen kompletten select Befehl die Summe ziehen?
    Geht vielleicht eine Verschachtelung ?

    Hier einmal die function, womit wir die Abfrage starten.

    PHP-Code:
    function display_db_VerkehrSumAW($StartName)
    {

        
    $query_string="select (Sum(a.Masse)/Count(*))+Sum(w.Masse)  from Bahnhof b, Fahreinsatz f, Zuege z, Zuege_has_Waggon x, Waggon w, Antrieb a where (b.StartName like \"%$StartName%\"and b.StartName=f.Bahnhof_StartName and f.Zuege_ZugBezeichnung=z.ZugBezeichnung and z.ZugBezeichnung=x.Zuege_ZugBezeichnung and x.Waggon_WaggonNr=w.WaggonNr and z.Antrieb_AntriebBezeichnung=a.AntriebBezeichnung)group by EinsatzNr";
      
      
    //printf("Query-String: %s ", $query_string);
      
    $result_id mysql_query($query_string);


       

      if (
    mysql_errno() != 0) {
        
    printf("Fehlercode = %d <br>"mysql_errno() );
        
    printf("Fehlermeldung = %s <br>"mysql_error() );
      }

      
    // Tabelle anzeigen lassen
      
    do_table ($result_id);

    Aufgabenstellung:
    Eine Liste der Züge (Zugnummern), die von einem bestimmten Bahnhof(Eingabe) gestartet sind. Außerdem soll die Gesamtmasse der Züge für diese Fahrten berechnet werden- dabei sollen ausschließlich Datenbankfunktionen zur Berechnung eingesetzt werden.

    Info:
    Ein Zug kann mehrere Waggons haben. Damit steht in der Tabelle Zuege_has_Waggons öfters die gleiche ZugBezeichnung mit unterschiedlichen Waggons. Daher soll er die Massen der Antriebe immer nur einmal berücksichtigt werden.

    Ich hoffe ihr könnt mir helfen.


  • #2
    Die original mysql-Erweiterung ist veraltet (mysql_*-Funktionen) und wird in den kommenden Versionen aus PHP entfernt. Aktuell wirft sie schon E_DEPRECATED-Fehler bei einer Verbindung zur Datenbank. Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung! Weiterführende Links:
    Choosing an API
    Warum man mysql* generell nicht (mehr) nutzen sollte.
    Wie man von mysql* auf PDO umsteigt
    Wissenswertes zum Thema SQL-Injection
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      Die MySQL-Extension von PHP ist deprecated ( veraltet ) und wird in naher Zukunft entfernt.

      Erstmal das Query in lesbar:
      Code:
      SELECT 
          ( SUM(a.Masse) / COUNT(*) ) + SUM(w.Masse)  
      FROM 
          Bahnhof b, 
          Fahreinsatz f, 
          Zuege z, 
          Zuege_has_Waggon x, 
          Waggon w, 
          Antrieb a 
      WHERE 
          (
              b.StartName like \"%$StartName%\" 
                  AND 
              b.StartName = f.Bahnhof_StartName 
                  AND 
              f.Zuege_ZugBezeichnung = z.ZugBezeichnung 
                  AND 
              z.ZugBezeichnung = x.Zuege_ZugBezeichnung 
                  AND 
              x.Waggon_WaggonNr = w.WaggonNr 
                  AND 
              z.Antrieb_AntriebBezeichnung = a.AntriebBezeichnung
          )
      GROUP BY EinsatzNr
      Du könntest ein Subselect nutzen und Joins verwenden:
      Code:
      SELECT
          ( SUM (`masse`) ) AS `result`
      FROM (
          SELECT
              ( SUM(a.`Masse`) / COUNT(*) ) + SUM(w.`Masse`) AS `masse`
          FROM
              `Bahnhof` AS b
          INNER JOIN
              `Fahreinsatz` AS f
                  ON
                      b.`StartName` = f.`Bahnhof_StartName`
          INNER JOIN
              `Zuege` AS z
                  ON
                      f.`Zuege_ZugBezeichnung` = z.`ZugBezeichnung`
          INNER JOIN
              `Zuege_has_Waggon` AS x
                  ON
                      z.`ZugBezeichnung` = x.`Zuege_ZugBezeichnung`
          INNER JOIN
              `Waggon` AS w
                  ON
                      x.`Waggon_WaggonNr` = w.`WaggonNr`
          INNER JOIN
              `Antrieb` AS a
                  ON
                      z.`Antrieb_AntriebBezeichnung` = a.`AntriebBezeichnung`
          GROUP BY EinsatzNr
      ) AS s
      Ungetestet.

      Ich empfehle dringenst einen Coding Standard zu etablieren, besonders was die SQL-Statements betrifft.
      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

      Kommentar


      • #4
        Zitat von Doctor X Beitrag anzeigen
        Kann man über einen kompletten select Befehl die Summe ziehen?
        Ja.

        Geht vielleicht eine Verschachtelung ?
        Sozusagen.

        Erst einmal änderst Du Dein SQL auf expliziete Joins um. Damit wir hier verstehen, worum es geht und nicht erst gedanklich zig Tabellen joinen müssen zeigst Du uns aber ein vereinfachtes Beispiel mit Beispieldaten und das, was rauskommen soll.
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Alternativ, wenn man das Ergebnis sowieso noch mit PHP verarbeitet, kann man auch erst dort alles zusammenrechnen.
          mysql ist veraltet Mails senden: Ohne Probleme und ohne mail()
          PHP-Code:
          echo 'PS: <b>Meine Antwort ist keine Lösung, sondern nur eine Hilfe zur Lösung.</b>'

          Kommentar

          Lädt...
          X