Announcement

Collapse
No announcement yet.

Subselect für Anfänger

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

  • Subselect für Anfänger

    Hallo,

    folgende Situation. Ich habe zwei Tabellen:

    Tabelle1
    KundenNr | Umsatz | Jahr
    --------------------------------
    01 | 100 | 2007
    02 | 300 | 2008
    02 | 200 | 2007
    01 | 150 | 2008
    * | * | *

    Tabelle2
    KundenNr | Rechnung | Rechnungsdatum
    -------------------------
    01 | 20 | 20.01.2007
    01 | 30 | 31.11.2008
    02 | 10 | 03.07.2007
    01 | 50 | 15.08.2008
    02 | 100 | 12.09.2007
    * | * | *

    Als Ergebnis einer Prozedur in IBExpert, soll folgendes erscheinen:
    Die Kundennummer mit dem Umsatz eines bestimmten Jahres aus der Tabelle1 und die Anzahl der Rechnungen die der Kunde in diesem Jahr gestellt hat.

    Beispielsweise für das Jahr 2007 -> Eingabeparameter: Jahr = 2007

    KundenNr | UmsatzImJahr | AnzahlDerRechnungen
    01 | 100 | 2
    02 | 200 | 3

    Versucht habe ich es mit einer Abfrage in der Form:

    Code:
    begin
    
    for select KundenNr, Umsatz
     (select count(KundenNr) from Tabelle2 
    where Tabelle1.KundenNr = Tabelle2.KundenNr and EXTRACT(YEAR FROM Rechnungdatum) = :Jahr) 
    as AnzahlDerRechnungen
    from Tabelle1 where Jahr = :Jahr
    order by umsatz
    into :KundenNr, :UmsatzImJahr
    
    do  suspend;
    end
    So läuft es nicht. Wie und wo muss ich den Subselect einbauen?

    Danke

  • #2
    Inline Subselects sind nicht gerade performant: Ich würde es mit einem Join versuchen

    Comment


    • #3
      Habe es jetzt so gelöst:

      Code:
      begin
      
      for select KundenNr, Umsatz
      from Tabelle1
      where Jahr = :Jahr
      order by Umsatz
      into :KundenNr, :UmsatzImJahr
      
      do begin
      
          select count(Tabelle2.KundenNr from Tabelle2
          where Tabelle2.KundenNr= :KundenNr and EXTRACT(YEAR FROM Rechnungdatum) = :jahr
          into :AnzahlDerRechnungen;
      
          suspend;
      end
      
      suspend;
      end
      Ob das jetzt performanter ist als ein Subselect ist, keine Ahnung.
      Mich würde trotzdem so eine Subselect-Lösung interessieren.

      Comment


      • #4
        Originally posted by abiogenesis View Post
        Habe es jetzt so gelöst:
        Ob das jetzt performanter ist als ein Subselect ist, keine Ahnung.
        Mich würde trotzdem so eine Subselect-Lösung interessieren.
        Mit Join [HIGHLIGHT="SQL"]SELECT KundenNr
        , Umsatz
        , Count(*) AS Anzahl
        FROM Tabelle1 AS T1
        JOIN Tabelle2 AS T2 ON T1.KundenNr = T2.KundenNr
        and EXTRACT(YEAR FROM T2Rechnungdatum) = :Jahr)
        WHERE Jahr = :Jahr
        GROUP BY Kundennr, Umsatz
        ORDER BY umsatz
        [/HIGHLIGHT]
        Zuletzt editiert von ebis; 05.05.2010, 17:49. Reason: Group By vergessen

        Comment


        • #5
          Das ist auch kein Join [highlight="sql"] select t1.KundenNr, avg( t1.umsatz] as Umsatz, count(t1. KundenNr) as Anzahl from Tabelle 1 t1 join Tabelle t2 on t2.KundenNr = t1.KundenNr group by t1.KundenNummer; [/highlight]

          Comment


          • #6
            Danke erst mal an euch beide. Komme heute nicht mehr zum testen. Werde morgen Bescheid geben ob ich es hin bekommen habe.

            Comment


            • #7
              @Ebis
              Hat perfekt funktioniert, Danke.

              Comment

              Working...
              X