Announcement

Collapse
No announcement yet.

"Anders aggregieren" rollup von min() soll avg() anzeigen

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

  • "Anders aggregieren" rollup von min() soll avg() anzeigen

    Hallo!

    Ich möchte gerne eine Liste anzeigen, bei welcher als Ergebnis der Durchschnitt der min() oder max() Spalten angezeigt wird.

    [highlight=sql]
    SELECT arbeitsgruppe, min(gehalt), max(gehalt), avg(gehalt)
    FROM saldo
    GROUP BY ROLLUP(arbeitsgruppe)
    [/highlight]

    Jetzt kommt bei ROLLUP ja bei min(gehalt) das insgesamt kleinste Gehalt heraus und bei max(gehalt) das jeweils größte und bei avg(gehalt) der Gesamtdurchschnitt der Gehälter.

    Nun würde ich gerne noch eine Zusatzspalte einfügen, bei der in dem "Rollup-Feld" das durchschnittlichen Mindest- bzw. Maximalgehalt steht.

    Code:
    min	max	avg	minavg	maxavg
    1000	3000	2000		
    1500	3500	2500		
    2000	4000	3000		
    1000	4000	2500	1500	3500
    Oder kann man das ROLLUP so "umbiegen", dass bei einer min() aggregierten Spalte ein avg() als Ergebnis raus kommt?

    Grüße,
    Yusuf

  • #2
    Suchst du vielleicht das hier: MAX(gehalt) OVER (PARTITION BY arbeitsgruppe)

    Gruss

    Comment


    • #3
      Vielleicht hilft das:

      [highlight=sql]
      with tab as(
      SELECT arbeitsgruppe, min(gehalt) min, max(gehalt) nax, avg(gehalt) avg
      FROM saldo
      GROUP BY ROLLUP(arbeitsgruppe)
      )
      select t.*
      ,case
      when arbeitsgruppe is not null then null
      else (select avg(min) from tab where arbeitsgruppe is not null)
      end
      ,case
      when arbeitsgruppe is not null then null
      else (select avg(max) from tab where arbeitsgruppe is not null)
      end
      from tab t
      [/highlight]

      Geht aber velleicht auch einfacher.

      /Funzel

      Comment


      • #4
        So geht es auch:

        [highlight=sql]
        WITH t AS
        (SELECT MIN(gehalt) AS MIN_GEHALT, MAX(gehalt) AS MAX_GEHALT, AVG(gehalt) AS AVG_GEHALT,
        GROUPING(arbeitsgruppe) AS ROLL_UP
        FROM saldo
        GROUP BY ROLLUP(arbeitsgruppe))
        SELECT MIN_GEHALT, MAX_GEHALT, AVG_GEHALT,
        DECODE(ROLL_UP, 1,AVG(MIN_GEHALT) OVER (PARTITION BY ROLL_UP), NULL) AS AVG_MIN,
        DECODE(ROLL_UP, 1,AVG(MAX_GEHALT) OVER (PARTITION BY ROLL_UP), NULL) AS AVG_MAX
        FROM t;
        [/highlight]

        Code:
        MIN_GEHALT MAX_GEHALT AVG_GEHALT AVG_MIN AVG_MAX
        1000       3000       2000		
        1500       3500       2500		
        2000       4000       3000		
        1000       4000       2500       1000    4000

        Gruss

        Comment


        • #5
          Vielen Dank für die Infos!

          Das mit dem MAX(gehalt) OVER (PARTITION BY arbeitsgruppe) hat soweit funktionioniert. Jetzt gibt es noch ein Problem.

          Wenn ich den Durchschnitt berechne, dann wird der Durchschnitt auch über die Summe von ROLLUP gebildet.

          Code:
          min	max	avg	minavg	maxavg
          1000	3000	2000		
          1500	3500	2500		
          2000	4000	3000		
          1000	4000	2500	1500	3500	soll
          			1375	3625	ist
          Die "1375 " und "3625" kommen dadurch, dass noch die "1000" und "4000" mit gerechnet wurden und durch vier geteilt wurde.

          Ich müsste quasi verhindern, dass die grouping() Zeilen in die Berechnung mit rein kommen. Einfach durch eine 0 ersetzen mit DECODE oder CASE WHEN geht ja nicht, da sonst der Durchschnitt falsch wäre. Es müsste alle grouping() Zeilen komplett auslassen.

          Wie geht das?

          Comment


          • #6
            Stimmt, du kannst es auch anders herum machen:
            [highlight=sql]
            SELECT MIN_GEHALT, MAX_GEHALT, AVG_GEHALT,
            DECODE(ROLL_UP, 0, AVG(MIN_GEHALT) OVER (PARTITION BY ROLL_UP), NULL) AS AVG_MIN,
            DECODE(ROLL_UP, 0, AVG(MAX_GEHALT) OVER (PARTITION BY ROLL_UP), NULL) AS AVG_MAX
            FROM t;[/highlight]

            Jetzt bleibt noch das Problem, dass die Zusatzdaten in der falschen Zeile stehen aber die Umformung müsste man irgendwie hinbekommen.

            Gruss

            Comment


            • #7
              Hallo

              Ein ganz anderer Ansatz könnte so aussehen:

              [highlight=sql]WITH t as
              (SELECT arbeitsgruppe, min(gehalt) as min_gehalt, max(gehalt) as max_gehalt, avg(gehalt) as avg_gehalt
              FROM saldo
              GROUP BY arbeitsgruppe)
              select min_gehalt, max_gehalt, avg_gehalt, NULL as minavg, NULL as maxavg
              from t
              union all
              select min(min_gehalt), max(max_gehalt), avg(avg_gehalt), avg(min_gehalt), avg(max_gehalt)
              from t[/highlight]

              Gruss

              Comment


              • #8
                Danke für die ganzen Infos - das hat mir sehr weiter geholfen!

                Grüße,
                Yusuf

                Comment

                Working...
                X