none
Anzeige aller MÖGLICHEN Ausprägungen einer Spalte RRS feed

  • 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

    Montag, 18. November 2019 11:19

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]

    Montag, 18. November 2019 12:04

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.

    Montag, 18. November 2019 11:29
  • 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]

    Montag, 18. November 2019 12:04
  • 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.


    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,

    Montag, 18. November 2019 15:09