Announcement

Collapse
No announcement yet.

1:n beziehung, SUM

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

  • 1:n beziehung, SUM

    Hallo

    Bin schon seit einiger zeit auf der such und ich versuche hier mal mein glück. das problem ist wahrscheinlich nur ein anfänger fehler, ich kann mir zumindest nicht vorstellen, dass mein lösungsansatz der "richtige" ist. folgendes:

    habe 2 tabellen, 1:n beziehung (also 1 vorgang hat mehrere positionen) und ich muss eine summe von tabelle A machen und das kriterium ist in tabelle B.

    so die erforderlichen zeilen sind mit distinct schnell ermittelt nur eben kann ich dann keine summe bilden - logisch. verwende ich eine gruppenfunktion summiert er genau so oft den wert in A, wie es dazugehörige zeilen in B gibt. mir ist schon klar warum er das macht.

    mir ist es zu umständlich, jedes mal eine view darüber zu machen, nur um die korrekte summen zu bilden. das muss doch anders gehen?

    danke auf jeden fall für die hilfe!

  • #2
    das geht schon, hier ein Beispiel (die Tabellen/Daten werden mit WITH generiert:
    Code:
    WITH 
     tabA AS 
      (SELECT 1 kategorie, 17 preis FROM dual UNION ALL
       SELECT 1          , 23       FROM dual UNION ALL
       SELECT 2          , 37       FROM dual UNION ALL
       SELECT 2          , 11       FROM dual UNION ALL
       SELECT 2          , 51       FROM dual UNION ALL
       SELECT 3          , 24       FROM dual),
     tabB AS 
      (SELECT 1 kategorie, 'A' artikel FROM dual UNION ALL
       SELECT 2          , 'B'         FROM dual UNION ALL
       SELECT 3          , 'C'         FROM dual)
     SELECT tabB.artikel, sum(tabA.preis) summe
       FROM tabA, tabB
      WHERE tabA.kategorie=tabB.kategorie   
      GROUP BY tabB.artikel;
    
    artikel summe
    ----------------
    A	  40
    B	  99
    C	  24

    Comment


    • #3
      hm, die tabelle ist nicht ganz so, wie ich es versucht habe zu erklären. die abfrage würde so lauten:

      Code:
      WITH 
       tabA AS
        (SELECT 1 auftrag, 'A' leistung FROM dual UNION ALL
         SELECT 1          ,   'A' FROM dual UNION ALL
         SELECT 2          ,   'A' FROM dual UNION ALL
         SELECT 2          ,   'A' FROM dual UNION ALL
         SELECT 2          ,   'A' FROM dual UNION ALL
         SELECT 4          ,   'A' FROM dual UNION ALL
         SELECT 4          ,   'B' FROM dual UNION ALL
         SELECT 4          ,   'C' FROM dual UNION ALL
         SELECT 3          ,   'A' FROM dual),
       tabB AS
        (SELECT 1 auftrag, 1 kunde, 1 preis FROM dual UNION ALL
         SELECT 2          , 2           , 10       FROM dual UNION ALL
         SELECT 4          , 2           , 100       FROM dual UNION ALL
         SELECT 3          , 1           , 20       FROM dual)
       SELECT tabB.kunde, sum(tabB.preis) summe
         FROM tabA, tabB
        WHERE tabA.auftrag=tabB.auftrag
         AND tabA.leistung = 'A' 
        GROUP BY tabB.kunde;

      hier bekomme ich für den kunde1 22 und für kunde2 130, aber eigentlich bräuchte ich nur jeden preis einmal zählen und nicht pro leistung einmal. der preis ist quasi der gesamtpreis der gekauften einzelnen leistungen.

      mir fällt hier nur ein, dass ich hier den gesamtpreis eigentlich aus den einzelnen positionen ausrechnen müsste. hoffe ich konnte das verständlich rüberbringen.

      lg

      Comment


      • #4
        Was soll denn nun eigentlich rauskommen ? Ich habe es nur mal etwas schöner formatiert:
        Code:
        WITH
         tabA AS --auftpos
         (SELECT 1 auftrag, 'A' leistung FROM dual UNION ALL
          SELECT 1        , 'A'          FROM dual UNION ALL
          SELECT 2        , 'A'          FROM dual UNION ALL
          SELECT 2        , 'A'          FROM dual UNION ALL
          SELECT 2        , 'A'          FROM dual UNION ALL
          SELECT 4        , 'A'          FROM dual UNION ALL
          SELECT 4        , 'B'          FROM dual UNION ALL
          SELECT 4        , 'C'          FROM dual UNION ALL
          SELECT 3        , 'A'          FROM dual),
         tabB AS --auftst
         (SELECT 1 auftrag, 1 kunde,   1 preis FROM dual UNION ALL
          SELECT 2        , 2      ,  10       FROM dual UNION ALL
          SELECT 4        , 2      , 100       FROM dual UNION ALL
          SELECT 3        , 1      ,  20       FROM dual)
         SELECT tabB.kunde, sum(tabB.preis) summe
           FROM tabA, tabB
          WHERE tabA.auftrag=tabB.auftrag
            AND tabA.leistung = 'A'
          GROUP BY tabB.kunde; 
        kunde summe
        ------------------
        1     22
        2    130

        Comment


        • #5
          es soll der gesamtumsatz des kunden rauskommen, von jedem auftrag, in dem ein Leistung A gebucht wurde.
          also kunde1: 21
          kunde2: 110

          Comment


          • #6
            Die Zeilen sind in tabA mehrfach vorhanden, wenn sich das nicht vermeiden lässt, muss man sie zusammenfassen (hier in tabAd):
            Code:
            WITH
             tabA AS --auftpos
             (SELECT 1 auftrag, 'A' leistung FROM dual UNION ALL
              SELECT 1        , 'A'          FROM dual UNION ALL
              SELECT 2        , 'A'          FROM dual UNION ALL
              SELECT 2        , 'A'          FROM dual UNION ALL
              SELECT 2        , 'A'          FROM dual UNION ALL
              SELECT 4        , 'A'          FROM dual UNION ALL
              SELECT 4        , 'B'          FROM dual UNION ALL
              SELECT 4        , 'C'          FROM dual UNION ALL
              SELECT 3        , 'A'          FROM dual),
             tabB AS --auftst
             (SELECT 1 auftrag, 1 kunde,   1 preis FROM dual UNION ALL
              SELECT 2        , 2      ,  10       FROM dual UNION ALL
              SELECT 4        , 2      , 100       FROM dual UNION ALL
              SELECT 3        , 1      ,  20       FROM dual)
             SELECT tabB.kunde, sum(tabB.preis) summe
               FROM (SELECT DISTINCT auftrag, leistung FROM tabA) tabAd, tabB
              WHERE tabAd.auftrag  = tabB.auftrag
                AND tabAd.leistung = 'A'
              GROUP BY tabB.kunde; 
            
            kunde summe
            ------------------
            1     21
            2    110

            Comment


            • #7
              ok danke hat mir schon sehr geholfen.

              es lässt sich leider nicht vermeiden, ergibt dann sinn, wenn du die restlichen spalten kennen würdest. so wie ich es gepostet habe, schaut das ganze natürlich etwas komsich aus.

              Comment

              Working...
              X