Announcement

Collapse
No announcement yet.

Unterabfrage

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Unterabfrage

    Hallo an Alle,

    leider komme ich bei einen simplen Problem nicht weiter.

    Wie üblich bei einer Datenbank habe ich zwei Tabellen. Tabelle1 ist die Belegtabelle und Tabelle enthält die Belegpositionen.

    Ich möchte nun gern von allen Belegen aus einem Monat

    Also

    Code:
    Select Belegnummer, Name, PLZ, Auftragswert from beleg b
    where Montagedatum between "01.03.2019" and "31.03.2019"
    dazu eine Summe aller Einkäufe aus der Belegpos. Verbunden sind beide über Belege = Belegnummer und Belegpos = Kommnr

    Die einzelne Abfrage wäre

    Code:
    Select sum(gesamt) from belegpos p where p.kommnr = b.BELEGNUMMER
    Diese Summe soll als Ausgabe hinter "Belegnummer, Name, PLZ, Auftragswert" kommen. Wenn die Unterabfrage keine Inhalt als Abfrage hat, soll null angezeigt werden.

    Ich hoffe, ich habe mich deutlich und verständlich ausgedrückt.

    Sollte Ihr Rückfragen haben, bitte stellen.

    Vielen Dank für Eure Hilfe.

    Ronin
    Zuletzt editiert von ronin269; 02.05.2019, 15:21.

  • #2
    Originally posted by ronin269 View Post
    ...
    Verbunden sind beide über Belege = Belegnummer und Belegpos = Kommnr

    Die einzelne Abfrage wäre

    ...where p.kommnr = b.BELEGNUMMER


    Ich hoffe, ich habe mich deutlich und verständlich ausgedrückt.
    Leider nicht ganz. Zunächst sprichst Du von 2 Schlüsselfeldern, dann schreibst Du in "die einzelne Abfrage wäre" nur noch einen Join rein.
    Außerdem immer latent nutzlos:
    Die Angabe von Feldnamen ohne Alias, sprich Tabellenherkunft. Selbst der Entwickler am Objekt muss das einzeln nachschlagen.
    Du hast bereits die Table Alias eingeführt, dann wäre die Angabe dieses einen zusätzlichen Buchstabens überall hilfreich, sowohl für Kollegen, als auch für Helfer. Das könnte man sich zur Gewohnheit machen.

    Lösungsprinzip wäre z.B.
    Code:
    select <irgendwelcheFelder>, t.sumup
      from maintable m
      join (select id, sum(val) as sumup from subtable s group by id) n
           on m.id = n.id
    Kommt vielleicht auf Mengengerüste und Filterwirkung der Whereclause an.

    Comment


    • #3
      Erst einmal Danke für deine Hilfe. Mit dem Alias werde ich berücksichtigen.

      Ich habe versucht, das Lösungsprinzip auf meine Angaben anzupassen

      Code:
      select b.BELEGNUMMER,   b.name,   b.PLZ,  n.sumup
        from Beleg b where b.belegdatum between "01.03.2019" and "31.03.2019"
      join      
        (select p.kommnr, sum(p.gesamt) as sumup from belegpos p where p.belegtyp = 'E' and p.Belegart = 'RE'  group by p.kommnr) n
      on b.belegnummer = n.kommnr
      Leider erhalte ich eine Fehlermeldung:

      Code:
      SelectQuery: Overflow occurred during data type conversion.Conversion error from string "".
      Noch eine Idee? Leider sehe ich nicht durch, warum t.sumup steht

      Comment


      • #4
        Sorry, da schreib ich wie toll Aliase sind und dann verbastel ich es.

        Korrigiertes Lösungsprinzip wäre z.B.
        Code:
        select <irgendwelcheFelder>, n.sumup
        from maintable m
        join (select id, sum(val) as sumup from subtable s group by id) n
        on m.id = n.id
        In Deinem Code solltest Du die Where Clause ganz ans Ende des Statements schreiben. Sie wirkt als Filter für das Ergebnis eines Select Statements.
        Der Conversion Error kommt wahrscheinlich vom Datestring, hier solltest Du besser mit einfach Hochkommata arbeiten und ein Cast verwenden.

        Comment


        • #5
          Ich habe es in meinen Fall umgewandelt, bekomme aber trotz aller möglichen Cast immer noch die Fehlermeldung.

          Code:
           
           SelectQuery: Overflow occurred during data type conversion.Conversion error from string "".
          Code:
           select  cast(m.BELEGNUMMER as Integer)  ,Cast(m.Name as Char),  cast(n.sumup as Float)                                                              
          from Beleg m
          join (select cast(s.kommnr as Integer) as id , sum(s.gesamt) as sumup from belegpos s group by s.kommnr) n
          on m.belegnr  = n.id where getdate(BELEGDATUM) between '01.03.2019' and '31.03.2019'
          Es kann ja eigentlich nur beim Vergleichen der beiden ID`s kommen.

          Die Felder m.Belegnummer liegt als Integer in der Datembank und n.Kommnr liegen in der Datenbank als String, sollten doch aber beide als Integer umgewandelt werden.

          es kann natürlich sein, dass die Summe(s.gesamt) null ist. Wenn dem so wäre, kann man dann dem Feld eine Null zuweisen?

          Comment


          • #6
            ah, kann man nicht ahnen, dass es verschiedene Typen sind, aber ich meinte eigentlich die Datumsvergleichen in where belegdatum between ..
            .. dachte das sein klar.

            Was macht nun getdate()?
            Ich bin davon ausgegangen, dass belegtdatum vom Typ Date ist, während '01.03.2019' und '31.03.2019' offensichtlich String sind.
            Welchen Teil davon castet man nun und in welche Richtung?
            Ein Stringvergleich mit between <untergrenze> and <obergrenze> würde mit diesen Texten niemals funktionieren.
            Also empfiehlt es sich, die between Abfrage über Dates zu machen.

            Comment


            • #7
              Da in der Tabelle s bei Kommnr alles mögliche stehen kann, wäre es wichtig, dass nur die Werte von Belegnummer von Tabelle "m" genommen werden.

              Comment


              • #8
                Hallo defo2,

                danke für deine Antwort und Hilfe. Mein zweiter Post hat sich überschnitten.

                Sorry hätte ich daran denken können, das es unterschiedliche Datentypen sind.

                Die Firebird wird von einem Programm benutzt und wurde durch gewisse Funktionen erweitert. Es löst das komplette Datum mit Uhrzeit in ein "nur" Datum.

                Das klappt 100 prozentig. Das Problem entsteht bei der Prüfung von m.id und n.id (oder bei mir m.belegnr=n.kommnr) Kommnr kann alles mögliche sein (Ist ein String).
                Zuletzt editiert von ronin269; 03.05.2019, 09:21.

                Comment


                • #9
                  Ich finde die Stelle zum casten

                  select cast(s.kommnr as Integer) as id

                  ungünstig und würde das erst beim Vergleich machen. Wenn s.kommnr alles möglich sein kann, also auch eine Zeichenfolge, die nicht in einen Integer umgewandelt werden kann, so musst du - sofern Firebird das kann - mittels eine case/when erst prüfen, ob in einen Integer gewandelt werden kann und im Negativfall eine -1 setzen

                  Siehe hier
                  https://stackoverflow.com/questions/...n-firebird-2-5
                  Zuletzt editiert von Christian Marquardt; 03.05.2019, 09:36.
                  Christian

                  Comment


                  • #10
                    Erstmal nochmals Danke für Eure Hilfe!

                    Code:
                     select m.BELEGNUMMER   ,m.Name ,  cast(n.sumup as Float)                                                              
                    from Beleg m    
                    join (select (CASE       WHEN s.kommnr like '1%' THEN CAST(s.kommnr AS INTEGER)
                          ELSE -1     END) as id , sum(s.gesamt) as sumup from belegpos s group by s.kommnr) n
                    on cast(m.belegnr as integer)  = n.id where getdate(Belegdatum) between '01.03.2019' and '10.03.2019'
                    Wenn ich die Select - Anweisung mit Case allein laufen lass, klappt alles ohne Fehler.

                    Wennn die Anweisung in das oben genannte Statement einbaue, kommt meine String Fehlermeldung, obwohl beide in Integer umgewandelt werden sollten.

                    Was mich wundert, In der Fehlermeldung steht eine m.BELEGNUMMER die nach Auswahl gar nicht stehen dürfte.

                    Code:
                    SQL-Fehler in Schritt 1:
                    TA_SQL.SelectQuery: Overflow occurred during data type conversion.Conversion error from string "114137/117815"
                    Gibt es denn so etwas wie eine Schleife? Mit dem ersten Statement erhalte ich eine Liste mit Namen und Nummer und zu jeder Nummer wird in Tabelle s die Summe zu meiner n.Kommnr gebildet?
                    Zuletzt editiert von ronin269; 03.05.2019, 13:42. Reason: Grammatik :-)

                    Comment


                    • #11
                      Dann würde ich doch mal das Statement ohne Belegnummer laufen lassen

                      select m.Name, cast(n.sumup as Float)....
                      Christian

                      Comment


                      • #12
                        Danke,

                        aber das ändert leider nichts an der Meldung.

                        Ich danke für Eure Hilfe, aber ich werde die Auswertung auf einer Webseite mit PHP lösen.

                        Viele Grüße Ronin

                        Comment


                        • #13
                          Vielleicht zeigst du mal die komplette, originale Fehlermeldung
                          Christian

                          Comment


                          • #14
                            Gern!

                            Comment


                            • #15
                              Oder aus dem eigentlichen Programm
                              Code:
                              SQL-Fehler in Schritt 1:
                              TA_SQL.SelectQuery: Overflow occurred during data type conversion.Conversion error from string "114137/117815".
                              
                              select m.Name1 , cast(n.sumup as Float)
                              from Beleg m
                              join (select (CASE WHEN s.kommnr like '1%' THEN CAST(s.kommnr AS INTEGER)
                              ELSE -1 END) as id , sum(s.gesamt) as sumup from belegpos s group by s.kommnr) n
                              on cast(m.belegnr as integer) = n.id where ZF_DACH_MONT_DAT between '01.03.2019' and '10.03.2019'

                              Comment

                              Working...
                              X