Announcement

Collapse
No announcement yet.

Alter von Personen in Gruppen zusammenfassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Alter von Personen in Gruppen zusammenfassen

    Hallo!

    Ich möchte für unseren Verein die Personen zu einem Stichtag in Altersgruppen und nach Geschlecht auswerten.

    Dazu habe ich eine datatable dtStruktur mit folgendem Aufbau
    AltersgruppeID(String)
    Bezeichnung(String)
    AlterVon(INT)
    AlterBis(INT)
    Sortierung(INT)


    Darin stehen die verschiedenen Altersgruppen, nach denen ich die Auswertung haben möchte, also z.B.
    U6 /// bis 6 Jahre /// 0 /// 6 /// 1
    7-10 /// 7 bis 10 Jahre /// 7 /// 10 /// 2
    11-15 /// 11 bis 15 Jahre /// 11 /// 15 /// 3
    usw.


    In einer zweiten datatable dtPerson habe ich die Personendaten, das Alter zum Stichtag habe ich anhand des Geburtsdatums der Einfachheit halber schon ausgerechnet. Die datatable hat folgenden Aufbau:
    PID(String)
    Name(String)
    AlterStichtag(INT)
    Geschlecht(string)


    Herauskommen soll eine datatable mit folgendem Aufbau:
    Bezeichnung /// Gesamt /// dav. M /// dav. W
    bis 6 Jahre /// 40 /// 17 /// 23
    7 - 10 Jahre /// 27 /// 15 // 12
    usw.


    Aktuell mach ich es so, dass ich für jede Zeile der dtStruktur jede Zeile der dtPerson durchlaufe und dann schaue, ob AlterStichtag zwischen den Altersgrenzen liegt und entsprechend auswerte.

    Hat jemand einen Weg, wie man das effizienter machen kann?

    Danke

  • #2
    Dort lösen wo die Daten her kamen bevor sie in den DataTables gelandet ist?

    Comment


    • #3
      Die Dtaen kommen von einem MS SQL Server.
      es dort zu lösen, war auch mein erster Gedanke, hat auch funktioniert, war aber, wahrscheinlich durch mein Vorgehen, noch langsamer.

      Meine Frage ist daher, ob es nicht einen schnelleren Weg gibt als den Ansatz, den ich habe?

      Comment


      • #4
        Originally posted by SQL-Rookie View Post
        Die Dtaen kommen von einem MS SQL Server.
        es dort zu lösen, war auch mein erster Gedanke, hat auch funktioniert, war aber, wahrscheinlich durch mein Vorgehen, noch langsamer.

        Meine Frage ist daher, ob es nicht einen schnelleren Weg gibt als den Ansatz, den ich habe?
        Für sowas gibt es Window Functions, sowas wie Rank oder Dense Rank könnte helfen. Wenn das nicht flexibel genug ist oder ungewohnt, tut es vielleicht auch einfach eine virtuelle oder feste Tabelle mit den gewünschten Ranges und einem Namen, die gegen die Geburtstage gejoint wird.

        Äh, cih seh grad, so eine Tabelle gibt es ja offenbar. Aber scheinbar verarbeitest Du das im Client, statt per SQL.
        Und es ist zu langsam? Wie groß ist denn Euer Verein? Da fällt mir bspw. der ADAC mit 18 Mio Mitgliedern ein, sollte aber auch gehen ..
        Gruß, defo

        Comment


        • #5
          [highlight=sql]
          SELECT p.AltersgruppeID, p.Geschlecht, COUNT(*)
          FROM dtStruktur s
          INNER JOIN dtPerson p ON p.AlterStichtag BETWEEN s.AlterVon AND s.AlterBis
          GROUP BY p.AltersgruppeID, p.Geschlecht
          WITH ROLLUP
          [/highlight]

          Das erzeugt zwar nicht genau die Datenstruktur die Du haben möchtest, Du erhältst aber pro Geschlecht und Altersgruppe die Summe und auch die Gesamtsumme für die Altersgruppe. Das ist die Zeile in der das Geschlecht null ist. Das wäre jetzt für mich die Kernlogik. Das noch auf Spalten umbiegen sollte eigentlich kein großes Problem sein. Falls doch meld Dich nochmal dann versuch ich das auch noch zu bauen.

          Comment


          • #6
            Originally posted by fanderlf View Post
            [highlight=sql]
            SELECT p.AltersgruppeID, p.Geschlecht, COUNT(*)
            FROM dtStruktur s
            INNER JOIN dtPerson p ON p.AlterStichtag BETWEEN s.AlterVon AND s.AlterBis
            GROUP BY p.AltersgruppeID, p.Geschlecht
            WITH ROLLUP
            [/highlight]

            Das erzeugt zwar nicht genau die Datenstruktur die Du haben möchtest, Du erhältst aber pro Geschlecht und Altersgruppe die Summe und auch die Gesamtsumme für die Altersgruppe. Das ist die Zeile in der das Geschlecht null ist. Das wäre jetzt für mich die Kernlogik. Das noch auf Spalten umbiegen sollte eigentlich kein großes Problem sein. Falls doch meld Dich nochmal dann versuch ich das auch noch zu bauen.
            Vielen Dank, genau so was habe ich gesucht. So läuft die Abfrage sogar auf dem Server.
            Den Spaltenaufbau bekomme ich dann noch hin, das ist kein Problem.

            Danke

            Comment

            Working...
            X