Funktion GROUP BY in pgAdmin 4 -> FEHLER

Ja okay ich bin Anfänger. Habe mir schon vieles angeschaut und Tabellen und Views mit Hilfe von pgAdmin 4 angelegt und Sie funktionieren alle.

Ich habe vor vielen Jahren eine Access Datenbank für Lieferaufträge eines Einzelhandels geschrieben und diese immer erweitert. Jetzt ist die Zeit Sie in eine SQL Umgebung zu übertragen. Das hat mit den Tabellen und den ersten Abfragen (Views) schon gut geklappt.

Ich arbeite mit macOS Version 15.1.1.

Jetzt stoße ich an eine Stelle, an der ich ein View in einem neuen View verarbeiten möchte. Im neuen View sollen aus den Ergebnissen des erstellen Views “abf_ls_pos” (er enthält alles Positionen der einzelnen Lieferscheine) über bestimmte Spalten Summen erstellt werden und bei einigen der erste Eintrag gezeigt werden. Der neue View “abf_ls_sum” soll dabei die Gruppierung über das Feld “ls_pnr” ausführen. Aber ich bekomme eine Fehlermeldung, die für mich keinen Sinn ergibt. Alle Feldnamen sind korrekt angegeben, aber vielleicht falsch "eingepackt bzw. dargestellt.

Hat jemand eine Idee oder Lösungsansatz.

Vielen Dank im Voraus.

Hier das Bild des Versuchsergebnisses (“Auftrag” ist das Schema) :

Zeig mal bitte die Struktur der View abf_ls_pos.

Meinst Du diesen Aufbau:

– View: Auftrag.abf_ls_pos

– DROP VIEW “Auftrag”.abf_ls_pos;

CREATE OR REPLACE VIEW “Auftrag”.abf_ls_pos
AS
SELECT ls.“ls-nr”,
ls.“ls-dat”,
ls.“ls-grund”,
ls.“ls-bem”,
ls.“ls-kun-nr”,
kund.“kund-privat”,
ls.“ls-adr”,
ls.“ls-termin”,
pos.“ls-pnr”,
pos.“ls-ppos”,
pos.“ls-pdat”,
pos.“ls-part”,
pos.“ls-pmng”,
pos.“ls-ppreis”,
kd.“kund-rabatt”,
pos.“ls-ppreis” * kd.“kund-rabatt” AS ls_kura,
pos.“ls-ppreis” - pos.“ls-ppreis” * kd.“kund-rabatt” AS “lspr-kura”,
pos.“ls-rabatt”,
pos.“ls-rabatt” / ‘-1’::integer::double precision AS “ls-rab”,
pos.“ls-pmwst”,
pos.“ls-ppreis” * pos.“ls-rabatt” AS ls_lsra,
pos.“ls-ppreis” - pos.“ls-ppreis” * pos.“ls-rabatt” AS “lspr-lsra”,
pos.“ls-pmng” * pos.“ls-ppreis” AS “ls-zs”,
pos.“ls-pmng” * pos.“ls-ppreis” * pos.“ls-rabatt” AS lsrb,
pos.“ls-pmng” * pos.“ls-ppreis” - pos.“ls-pmng” * pos.“ls-ppreis” * pos.“ls-rabatt” AS “ls-zs-lsrb”,
pos.“ls-pmng” * pos.“ls-ppreis” * pos.“ls-pmwst” AS “ls-pos-mwst”,
pos.“ls-pmng” * pos.“ls-ppreis” - pos.“ls-pmng” * pos.“ls-ppreis” * pos.“ls-rabatt” + pos.“ls-pmng” * pos.“ls-ppreis” * pos.“ls-pmwst” AS “ls-gs”,
art.“art-pf-wert” * pos.“ls-pmng” AS “pfand-n”,
art.“art-pf-wert” * pos.“ls-pmng” * pos.“ls-pmwst” AS “pfand-mwst”,
CASE
WHEN kund.“kund-privat” = false THEN art.“art-pf-wert” * pos.“ls-pmng” + art.“art-pf-wert” * pos.“ls-pmng” * pos.“ls-pmwst”
ELSE art.“art-pf-wert” * pos.“ls-pmng”
END AS pfand,
pos.“ls-pmng” * pos.“ls-ppreis” - pos.“ls-pmng” * pos.“ls-ppreis” * pos.“ls-rabatt” + pos.“ls-pmng” * pos.“ls-ppreis” * pos.“ls-pmwst” +
CASE
WHEN kund.“kund-privat” = false THEN art.“art-pf-wert” * pos.“ls-pmng” + art.“art-pf-wert” * pos.“ls-pmng” * pos.“ls-pmwst”
ELSE art.“art-pf-wert” * pos.“ls-pmng”
END AS “lsgs+pfand”,
kd.“kund-art-preis”,
art.“art-nr”,
art.“art-bez”,
art.“meng-eh”,
art.“art-beschr”,
art.“art-herkunft”,
art.“art-verpack”,
art.“art-bio”,
art.“art-demeter”,
art.“art-pfand”,
art.“art-pf-wert”,
art.art_sortiment,
kd.“st-art-nr”,
kd.“kund-nr”,
kd.“kund-art-nr”,
kd.“kund-art-bez”,
kd.“kund-meng”,
kd.“kund-mg-eh”,
kd.“kund-dat”,
kd.“kund-bem”
FROM “Auftrag”.tab_ls ls
LEFT JOIN “Auftrag”.tab_ls_pos pos ON ls.“ls-nr” = pos.“ls-pnr”
LEFT JOIN “Auftrag”.tab_art art ON pos.“ls-part” = art.“art-nr”::double precision
LEFT JOIN “Auftrag”.“uabf_ls-pos_kd” kd ON art.“art-nr”::double precision = kd.“st-art-nr”
LEFT JOIN “Auftrag”.tab_kund kund ON ls.“ls-kun-nr” = kund.“kund-nr”::double precision
ORDER BY pos.“ls-ppos”;

ALTER TABLE “Auftrag”.abf_ls_pos
OWNER TO postgres;

im view ist es “ls-pnr”, in der Abfrage “ls_pnr”. Hint: “-” != “_”.

2 „Gefällt mir“

Danke Andreas, das du schon geantwortet hast. :+1:

1 „Gefällt mir“

Danke für Eure Bemühungen und die Fehlerfindung.

kleiner Hinweis noch: wenn man die Fehlermeldung GENAU liest, steht da schon die Lösung. Auch das ist etwas, was PostgreSQL so cool macht :wink:

Grüße aus Dresden.

1 „Gefällt mir“

ch werde mir diesen Rat zu Herzen nehmen.

Am besten schreibt man nur SQL bei dem man grundsätzlich keine doppelten Anführungszeichen benötigt

Ich würde empfehlen, Namen die doppelte Anführungszeichen benötigen schon beim Anlegen der Tabellen so zu schreiben, dass die Anführungszeichen nicht notwendig sind. Also auftrag statt "Auftrag" und st_art_nr statt st-art-nr usw.

Ich weiß nicht wie viel Code Du schon hast, der diese Namen verwenden, aber vielleicht ist es noch möglich das nachträglich zu ändern.

Unabhängig davon: ich finde ein Feld “Kunden Nr” als double precision etwas merkwürdig - aber ich kenne Deine Daten natürlich nicht. Im Regelfall ist das ein varchar oder ein integer Feld. Warum würde man bei einer Kundennummer Dezimalstellen benötigen?

2 „Gefällt mir“