Benutzer mit den meisten Antworten
Anzeige aller MÖGLICHEN Ausprägungen einer Spalte

Frage
-
Hallo allerseits,
im Augenblick stehe ich gerade im Wald und seh' selbigen vor lauter Bäumen nicht mehr.
Ich habe hier einen Datensatz mit Personendaten, die unter anderem Staatsangehörigkeit, Geschlecht und Altersjahrgang enthalten.
Die Abfrage:
select staat, geschlecht, altersjahrgang,
count(ID)
from bestand
group by
staat, geschlecht, altersjahrgang;
liefert mir - wie zu erwarten - für alle vorkommenden Kombinationen die Anzahl der Personen.
Hinter staat und altersjahrgang liegen jeweils Schlüsseltabellen.
Dabei entstehen aber "Lücken", wenn z.B. ein Altersjahrgang nicht vorkommt.
Um die Daten in einer anderen Anwendung weiterverarbeiten zu können, sollen alle Einträge dieser beiden Schlüsseltabellen ausgegeben werden, auch wenn es keine Person gibt, die diese Ausprägungen aufweist.
Aber wie oben schon geschrieben, sehe ich momentan den Wald vor lauter Bäumen nicht und finde entsprechend keinen Ansatz, wie ich das Problem angehen kann.
Kann mir da jemand etwas unter die Arme greifen?
Ich bin für jeden Tipp dankbar
Schönen Gruß
Benne
Antworten
-
Um die Daten in einer anderen Anwendung weiterverarbeiten zu können, sollen alle Einträge dieser beiden Schlüsseltabellen ausgegeben werden, auch wenn es keine Person gibt, die diese Ausprägungen aufweist.
Hallo Benne,
ermittle je Feld alle möglichen Vorkommen, bilde darüber ein Kreuzprodukt und joine das mit den vorhandenen Daten.
;with sta as (select distinct start from bestand) ,ges AS (select distinct geschlecht from bestand) ,alt AS (select distinct altersjahrgang from bestand) SELECT sta.staat, ges.geschlecht, alt.altersjahrgang, count(*) FROM sta cross join ges cross join alt left join bestand as bes on sta.staat = bes.staat and ges.geschlecht = bes.geschlecht and alt.altersjahrgang = bes.altersjahrgang group by sta.staat, ges.geschlecht, alt.altersjahrgang
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Freitag, 22. November 2019 08:22
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Montag, 2. Dezember 2019 11:21
Alle Antworten
-
Betrachte deine Anwendungslogik:
Punkt1: du hast eine Anzeige (Grid, Formular) der aktuellen Werte einer Zeile.
Punkt2: Um nun z.B. den Inhalt einer Spalte per Auswahl-Dropdown ändern zu können, benötigst du hier nun ein DropDown-Feld, in dem dir alle Möglichkeiten angezeigt werden.Ein Dropdown-Feld hat eine eigene DataSource-Eigenschaft und i.d.R. eine ValueFeld- und DisplayFeld-Eigenschaft.
Des weiteren gibt es nun noch den Stil: Dropdown (Auswahl + manuelle Eingabe), DropdownListe (nur Listauswahl).Je nach Framework/Controls-Satz hast du da nun unterschiedliche Möglichkeiten.
-
Um die Daten in einer anderen Anwendung weiterverarbeiten zu können, sollen alle Einträge dieser beiden Schlüsseltabellen ausgegeben werden, auch wenn es keine Person gibt, die diese Ausprägungen aufweist.
Hallo Benne,
ermittle je Feld alle möglichen Vorkommen, bilde darüber ein Kreuzprodukt und joine das mit den vorhandenen Daten.
;with sta as (select distinct start from bestand) ,ges AS (select distinct geschlecht from bestand) ,alt AS (select distinct altersjahrgang from bestand) SELECT sta.staat, ges.geschlecht, alt.altersjahrgang, count(*) FROM sta cross join ges cross join alt left join bestand as bes on sta.staat = bes.staat and ges.geschlecht = bes.geschlecht and alt.altersjahrgang = bes.altersjahrgang group by sta.staat, ges.geschlecht, alt.altersjahrgang
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Freitag, 22. November 2019 08:22
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Montag, 2. Dezember 2019 11:21
-
Hinter staat und altersjahrgang liegen jeweils Schlüsseltabellen.
Dabei entstehen aber "Lücken", wenn z.B. ein Altersjahrgang nicht vorkommt.
Um die Daten in einer anderen Anwendung weiterverarbeiten zu können, sollen alle Einträge dieser beiden Schlüsseltabellen ausgegeben werden, auch wenn es keine Person gibt, die diese Ausprägungen aufweist.
Die Einträge für die Lücken stehen aber in den Schlüsseltabellen und verweisen dann eben auf keinen Schlüssel in deiner Personentabelle, oder?
Fehlt da nicht sowieso in deiner Abfrage ein Join auf die Schlüsseltabelle? Und dann sollte man doch mit einem RIGHT JOIN alle Schlüssel, auch die mit NULL in der Personentabelle, ausgeben können. Und das kommt dann in deine Anwendungslogik.
- Bearbeitet Eiko Richter Montag, 18. November 2019 12:06
-
Oder anders herum betrachtet:
Als Primärtabelle musst du eine Schlüsseltabelle verwenden und diese dann per "Left Join" verbinden.
Problematisch wird es, wenn du mehrere Schlüsseltabellen hast.Um alle Kombinationen zu laden benötigst du dann einen Crossjoin:Select * from (
select * from Key1Tab, Key2Tab, ...
) allkeys
left join ....Bedenke dabei, dass ein Crossjoin ein Multiplikator ist und die Anzahl der Datensätze ins uferlose steigen kann.
Wir haben z.Z. knapp 200 Staaten, 3 Geschlechter und ca. 100 Jahrgänge.
Dies würde über alle Kombinationen eben 60.000 Zeilen ergeben.Für mich entzieht sich da der Sinn der Aufgabe,