Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Feld "Brutto-Betrag" aus einer von 3 möglichen Tabellen anzeigen (https://www.delphipraxis.net/187676-feld-brutto-betrag-aus-einer-von-3-moeglichen-tabellen-anzeigen.html)

erich.wanker 21. Dez 2015 14:09

Datenbank: Firebird • Version: 2.5 • Zugriff über: Zeos Lib 7

Feld "Brutto-Betrag" aus einer von 3 möglichen Tabellen anzeigen
 
Hallo ..
Ich versuche schon ne geraume Zeit ein SQl-Statement zusammenzubasteln .. leider ergebnislos :-(

GEGEBEN:

Tabelle1 : OVERVIEW
Code:
ID |  Eintragsname |  ID_Kunde | ID_LEISTUNG | TABELLENNAME ........

Tabelle2 : ENTSCHAEDIGUNG
Code:
ID |  Eintragsname | BRUTTO | NETTO |  EINHEIT |  MWST |  WAEHRUNG | ANZAHL .....
Tabelle3 : FREIKARTEN
Code:
ID |  Eintragsname | BRUTTO | NETTO |  EINHEIT |  MWST |  WAEHRUNG | ANZAHL ....
Tabelle4 : UMSATZBETEILIGUNG
Code:
ID |  Eintragsname | BRUTTO | NETTO |  EINHEIT |  MWST |  WAEHRUNG | ANZAHL ...

Wenn Ich nun die OVERVIEW anhand ID-KUNDE = 10 filtere - sehe ich:


1 Entschädigung 1 10 100 ENTSCHAEDIGUNG
2 Entschädigung 2 10 101 ENTSCHAEDIGUNG
3 Eine Freikarte 10 201 FREIKARTEN
4 Eine Beteiligung 10 208 UMSATZBETEILIGUNG

FRAGE
jetzt hätte ich aber gerne in der OVERVIEW die Spalte "Brutto" noch gerne dabei ..
ABER Brutto ist ja in einer der 3 Leistungsdatenbänke ..

Ich hab in der Overview den Tabellennamen der betreffenden Leistung abgespeichert .. kann ich mit dem was anfangen??



Vielen Dank für Hinweise
Erich

DeddyH 21. Dez 2015 14:16

AW: Feld "Brutto-Betrag" aus einer von 3 möglichen Tabellen anzeigen
 
Ich verstehe zwar zum größten Teil nur Bahnhof, aber so auf den ersten Blick scheint Deine DB nicht "ordentlich" (d.h. mindestens 3.NF) normalisiert zu sein. Kannst Du evtl. etwas an der Struktur ändern, oder ist die fix vorgegeben?

MrSpock 21. Dez 2015 14:17

AW: Feld "Brutto-Betrag" aus einer von 3 möglichen Tabellen anzeigen
 
Kannst du die Leistungs-Tabellen ändern?

So wie es aussieht, haben die 3 Tabellen denselben Aufbau. Dann solltest du diese drei Tabelle zusammenfassen und eine neue Spalte "Leistungstyp" dazupacken. Dann kannst du in der Overviewtabelle auch den Leistungstyp benutzen.

haentschman 21. Dez 2015 14:20

AW: Feld "Brutto-Betrag" aus einer von 3 möglichen Tabellen anzeigen
 
Hallöle...:P

Ich finde du machst es dir zu schwer. Die 3 Tabellen kann man in einer Tabelle mit einem zusätzlichen Feld das den Typ "deklariert" verwalten. Ich benutze gern einen Integer als ID für so etwas, welche man dann über Enumerations im Programm abbilden kann.
Dann hättest du in deiner Overview Tabelle nur die Leistung ID und ein einfacher JOIN auf die "Leistungstabelle" reicht. :thumb:

Doppelt gemoppelt ist immer wieder gut... :P Ich hab am meisten Text... deswegen war ich zu langsam. :stupid:

erich.wanker 21. Dez 2015 14:55

AW: Feld "Brutto-Betrag" aus einer von 3 möglichen Tabellen anzeigen
 
Hallo DeddyH & MrSpock ..

Leider kann ich die Struktur nicht ändern ...


Hallo haentschman ..

Die 3 verschiedenen Leistungstabellen sind schon gegeben ..

in der "ENTSCHAEDIGUNG" sind zusätzlich viele Felder betreffend "Konsumentenpreis-Indexanpassung"
in der "UMSATZBETEILIGUNG" sind zusätzlich viele Feldber betreffend Zeiträume, Minimalbeträge, Umsatz% .
in der "FREIKARTEN" sind zusätzlich viele Kartendaten .. berechtigte Personen ect ..

Was alle 3 "Leistungstabellen" gemeinsam haben sind: Brutto, Netto, MWst .. und diese Werte sollte ich in der "OVERVIEW" darstellen ..



ich hoffe ja immer noch dass eine sql-Abfrage mit tabellenname als variable ?? möglich ist ..
oder eine IIF mit fixen tabellennamen ?? ..

ThanX
Erich

dataspider 21. Dez 2015 15:04

AW: Feld "Brutto-Betrag" aus einer von 3 möglichen Tabellen anzeigen
 
Zitat:

Zitat von erich.wanker (Beitrag 1325016)
Ich hab in der Overview den Tabellennamen der betreffenden Leistung abgespeichert .. kann ich mit dem was anfangen??

Also, die Vorredner haben alle recht. Auch ich würde mit diesem DB - Design nicht weitermachen.
Falls du es aber aus irgendeinem Grunde musst - dann kannst du die Spalte Brutto mit CASE etwa so formulieren:

Code:
case
  when tabellenname = 'ENTSCHAEDIGUNG' then (select brutto from entschaedigung where id = leistung_id)
  when tabellenname = 'UMSATZBETEILIGUNG' then (select brutto from umsatzbeteiligung where id = leistung_id)
  when tabellenname = 'FREIKARTEN' then (select brutto from freikarten where id = leistung_id)
end brutto
sofern ich das Feld LEISTUNG_ID richtig interpretiert habe.

Frank

Olli73 21. Dez 2015 15:16

AW: Feld "Brutto-Betrag" aus einer von 3 möglichen Tabellen anzeigen
 
Alternativ (ungetestet!):
Code:
select
  x.*,
  y.brutto
from
  OVERVIEW x
  left join (
    select 'ENTSCHAEDIGUNG' as Tabellenname, ID, BRUTTO from entschaedigung
    union
    select 'FREIKARTEN' as Tabellenname, ID, BRUTTO from freikarten
    union
    select 'UMSATZBETEILIGUNG' as Tabellenname, ID, BRUTTO from umsatzbbeteiligung
    ) y
    on x.tabellenname = y.tabellenname and x.id_leistung = y.id
where
  x.ID = 10

jobo 21. Dez 2015 16:28

AW: Feld "Brutto-Betrag" aus einer von 3 möglichen Tabellen anzeigen
 
Zitat:

Zitat von erich.wanker (Beitrag 1325027)
ich hoffe ja immer noch dass eine sql-Abfrage mit tabellenname als variable ?? möglich ist ..
oder eine IIF mit fixen tabellennamen ?? ..

Die Hoffnung stirbt zuletzt! :)
Ich befürchte für den ersten Teil muss man sehr alt werden, um es zu erleben.
Der 2.Teil wurde ja schon gelöst, hier noch eine Variante, mix aus 1. und 2. Vorschlag. Dabei geht es nur um Performance, nimm was am schnellsten läuft (und natürlichem "richtigsten").

Ansonsten möchte ich wie die anderen vor mir dringend raten, dieses Datenmodell ordentlich zu überarbeiten. Mit dem aktuellen kommst Du auf Dauer in Teufelsküche.

Code:
-- ungetestet
select x.*,
       case
         when tabellenname = 'ENTSCHAEDIGUNG'   then e.brutto
         when tabellenname = 'UMSATZBETEILIGUNG' then u.brutto
         when tabellenname = 'FREIKARTEN'       then f.brutto
       end as brutto
  from OVERVIEW x
  left join (select ID, BRUTTO from entschaedigung) e
    on x.id = e.id
  left join (select ID, BRUTTO from freikarten) f
    on x.id = f.id
  left join (select ID, BRUTTO from umsatzbbeteiligung) u
    on x.id = u.id
/*where
  ... andere bedingungen..*/


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz