Mat
Aktives Mitglied
Moin, ich komme grad nicht darauf, wie ich das am besten lösen könnte. Es läuft, aber habe eine Denkblockade und weiß nicht, ob es korrekt ist:
Nun würde ich gerne eine Kundenspezifische Preisliste als View haben.
Scheint zu klappen. Wenn ich den Kundenfilter auf NULL setze, zeigt er mir auch eine ganz normale Preisliste ohne Kundenpreise. Aber ist das vielleicht zu umständlich gedacht?
Anwendungsfall
Zur Erstellung von Angeboten/Rechnungen wird in einer DB nach hinterlegten Preisen gesucht. Diese sind in einer Preisliste hinterlegt. Einige Kunden haben für einige Produkte eigene Preise. Diese sollen dann anstelle der normalen Preise benutzt werden.Nun würde ich gerne eine Kundenspezifische Preisliste als View haben.
Beispiel
Habe ein vereinfachtes Beispiel erstellt, mit Kundenfilter in einer Filtertabelle:
vSpeziFisch:
SELECT "SP".id, "SP".preis AS "STANDARDPREIS",
"KP".kd_id, "KP".preis AS "KUNDENPREIS",
(CASE
WHEN "KP".preis > 0 THEN "KP".preis
ELSE "SP".preis
END) AS "EFFEKTIVER_PREIS"
, "FLTR".*
FROM "Standardpreise" "SP"
LEFT JOIN "Filter" "FLTR" ON "FLTR".schluessel = 'KUNDE'
LEFT JOIN "Kundenpreise" "KP" ON
"SP".id = "KP".preis_id AND "KP".kd_id = "FLTR".wert;
Ergebnis mit Filter auf kd_id=2 :
id | STANDARDPREIS | kd_id | KUNDENPREIS | EFFEKTIVER_PREIS | schluessel | wert |
---|---|---|---|---|---|---|
1 | 10 | 2 | 8 | 8 | KUNDE | 2 |
2 | 20 | 20 | KUNDE | 2 | ||
3 | 30 | 30 | KUNDE | 2 | ||
4 | 40 | 40 | KUNDE | 2 | ||
5 | 50 | 50 | KUNDE | 2 | ||
6 | 60 | 60 | KUNDE | 2 | ||
7 | 70 | 70 | KUNDE | 2 | ||
8 | 80 | 80 | KUNDE | 2 | ||
9 | 90 | 90 | KUNDE | 2 | ||
10 | 100 | 2 | 125 | 125 | KUNDE | 2 |
Scheint zu klappen. Wenn ich den Kundenfilter auf NULL setze, zeigt er mir auch eine ganz normale Preisliste ohne Kundenpreise. Aber ist das vielleicht zu umständlich gedacht?
Falls Details benötigt werden:
DB mit Daten:
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "Standardpreise" (
"id" INTEGER NOT NULL UNIQUE,
"preis" NUMERIC DEFAULT 0.0,
PRIMARY KEY("id" AUTOINCREMENT)
);
CREATE TABLE IF NOT EXISTS "Kundenpreise" (
"preis_id" INTEGER NOT NULL,
"kd_id" INTEGER NOT NULL,
"preis" NUMERIC DEFAULT 0.0,
PRIMARY KEY("preis_id","kd_id")
);
CREATE TABLE IF NOT EXISTS "Kunden" (
"id" INTEGER NOT NULL UNIQUE,
"name" TEXT,
PRIMARY KEY("id" AUTOINCREMENT)
);
CREATE TABLE IF NOT EXISTS "Filter" (
"schluessel" TEXT NOT NULL UNIQUE,
"wert" INTEGER,
PRIMARY KEY("schluessel")
);
INSERT INTO "Standardpreise" VALUES (1,10);
INSERT INTO "Standardpreise" VALUES (2,20);
INSERT INTO "Standardpreise" VALUES (3,30);
INSERT INTO "Standardpreise" VALUES (4,40);
INSERT INTO "Standardpreise" VALUES (5,50);
INSERT INTO "Standardpreise" VALUES (6,60);
INSERT INTO "Standardpreise" VALUES (7,70);
INSERT INTO "Standardpreise" VALUES (8,80);
INSERT INTO "Standardpreise" VALUES (9,90);
INSERT INTO "Standardpreise" VALUES (10,100);
INSERT INTO "Kundenpreise" VALUES (1,1,5);
INSERT INTO "Kundenpreise" VALUES (1,3,11);
INSERT INTO "Kundenpreise" VALUES (2,1,18.5);
INSERT INTO "Kundenpreise" VALUES (10,2,125);
INSERT INTO "Kundenpreise" VALUES (1,2,8);
INSERT INTO "Kunden" VALUES (1,'Horst');
INSERT INTO "Kunden" VALUES (2,'Peter');
INSERT INTO "Kunden" VALUES (3,'Astrid');
INSERT INTO "Filter" VALUES ('KUNDE',2);
CREATE VIEW "vSpeziFisch" AS SELECT
"SP".id,
"SP".preis AS "STANDARDPREIS",
"KP".kd_id,
"KP".preis AS "KUNDENPREIS",
(CASE
WHEN "KP".preis > 0 THEN "KP".preis
ELSE "SP".preis
END) AS "EFFEKTIVER_PREIS"
, "FLTR".*
FROM "Standardpreise" "SP"
LEFT JOIN "Filter" "FLTR" ON "FLTR".schluessel = 'KUNDE'
LEFT JOIN "Kundenpreise" "KP" ON
"SP".id = "KP".preis_id AND "KP".kd_id = "FLTR".wert;
COMMIT;