sql query mit coalesce, sum und group by

hallo zusammen,

ich komme bei einem query leider nicht weiter.
Vielleicht kann jemand weiterhelfen.

Meine Postgres Tabelle sieht folgendermassen aus:

CREATE TABLE Table1
    ("nummer" int, "nachname" varchar(5),"breite" varchar(5),"laenge" varchar(5), "vorname" varchar(9), "cash" numeric)
;
    
INSERT INTO Table1
    ("nummer", "nachname","breite","laenge","vorname", "cash")
VALUES
    (2, 'Bert', '555','2','Brecht', 0.758),
    (2, 'Harry','555','2', 'Belafonte', 0,758),
    (3, 'Elvis','543','33', 'Presley', 0.357),
    (3, 'Roy','543','31', 'Orbison', 0.357),
    (4, 'Mark','52','33', 'Twain', 1.555),
    (4, 'Ella','69','33', 'Fitz', 0.333);

Nun möchte ich die Reihen aufgrund der Nummer gruppieren, die Namen koalisieren und die Werte bei Cash addieren.
Soweit kein Problem. Jedoch möchte ich die Werte nur addieren wenn breite und länge in den gruppierten Reihen unterschiedlich sind.
falls nicht soll nicht addiert werden. Meine gewünschte Ausgabe wäre beispielsweise:

2   Bert Brecht        0,758
    Harry Belafonte

…

4  Mark Twain    1,888
    Ella Fitz

Ich denke ich benötige noch ein Distinct on, weiß aber leider nicht wie.

hier mein bisheriger quert:

SELECT DISTINCT
nummer, 
 array_to_string(array_agg(nachname|| ', ' ||coalesce(vorname, '')), '\n') as name,
 sum (cash) as cash
FROM (
  SELECT DISTINCT
         nummer, vorname, nachname, cash
  FROM   Table1
  ) AS m
GROUP BY nummer
ORDER BY nummer;

Hier eine Fiddle zum bisherigen Stand:
SQL Fiddle


Besten Dank,

Tony

Welcher Wert in der Spalte Cash soll addiert werden, wenn zwei Einträge die selbe Breite und Länge haben?


Anhand dieser Daten bitte die gewünschte Ausgabe anzeigen:

INSERT INTO Table1 VALUES (2, ‘Brecht’, ‘555’, ‘2’, ‘Bert’, 0.758);
INSERT INTO Table1 VALUES (2, ‘Belafonte’, ‘555’, ‘2’, ‘Harry’, 1.568);
INSERT INTO Table1 VALUES (3, ‘Presley’, ‘543’, ‘33’, ‘Elvis’, 0.357);
INSERT INTO Table1 VALUES (3, ‘Orbison’, ‘543’, ‘31’, ‘Roy’, 0.357);
INSERT INTO Table1 VALUES (4, ‘Twain’, ‘52’, ‘33’, ‘Mark’, 1.555);
INSERT INTO Table1 VALUES (4, ‘Fitz’, ‘69’, ‘33’, ‘Ella’, 0.333);
INSERT INTO Table1 VALUES (5, ‘Simpson’, ‘52’, ‘33’, ‘Homer’, 1.555);
INSERT INTO Table1 VALUES (5, ‘Simpson’, ‘69’, ‘33’, ‘Lisa’, 0.333);
INSERT INTO Table1 VALUES (5, ‘Simpson’, ‘69’, ‘33’, ‘Bart’, 2.533);
INSERT INTO Table1 VALUES (5, ‘White’, ‘55’, ‘33’, ‘Mr’, 2.533);

Vielleicht zählen, wie oft was vorkommt:

test=*# select nummer, nachname || ' ' || vorname, breite, laenge, row_number() over (partition by nummer), row_number() over (partition by nummer, breite, laenge) from table1 ;
 nummer |    ?column?     | breite | laenge | row_number | row_number
--------+-----------------+--------+--------+------------+------------
      2 | Bert Brecht     | 555    | 2      |          1 |          1
      2 | Harry Belafonte | 555    | 2      |          2 |          2
      3 | Roy Orbison     | 543    | 31     |          2 |          1
      3 | Elvis Presley   | 543    | 33     |          1 |          1
      4 | Mark Twain      | 52     | 33     |          1 |          1
      4 | Ella Fitz       | 69     | 33     |          2 |          1
(6 rows)

Mit den letzten beiden Spalten kannst Du nun offenbar Deine Bedingungen abfragen - der Rest scheint mir via CASE - Konstrukte nun lösbar.

Andreas

Hast Du inzwischen eine Lösung? Hast Du SQL Abfrage schon entdeckt?


Andreas

Das SQL-Statement aus dem anderen Forum habe ich geschrieben, jedoch ist mir nachher aufgefallen, dass dies nicht der richtige Weg gewesen ist.

Nun möchte ich die Reihen aufgrund der Nummer gruppieren, die Namen koalisieren und die Werte bei Cash addieren.
Soweit kein Problem. Jedoch möchte ich die Werte nur addieren wenn breite und länge in den gruppierten Reihen unterschiedlich sind.
falls nicht soll nicht addiert werden. Meine gewünschte Ausgabe wäre beispielsweise:

In meinem SQL habe ich die Werte addiert, wenn die Werte der Spalte Cash sich unterschieden haben. Gewünscht war jedoch die Überprüfung auf Abweichungen in der Breite oder Länge.

Naja, meine Frage steht jedoch noch offen (vom 27.11.2012, 14:32).