Rocco: Kategorien bilden

Hallo,

ich habe eine Tabelle, in der u.a. das Alter von Personen gespeichert ist.

Vereinfacht:

id | Alter
----------
 1    15
 2    23
 3    25
 4     7

u.s.w.

Nun möchte ich gerne zählen, wie viele Personen verschiedenen Alterskategorien zugehörig sind, z.B. 0 bis 10, 11 bis 20 etc.
Ergebnis soll also etwa so aussehen:

Kategorie | Anzahl
------------------
 0 bis 10      1
11 bis 20      1
21 bis 30      2

u.s.w.

(Spalte Kategorie muß nicht ausgegegen werden, dient hier nur der Veranschaulichung)

Ich habe das bis jetzt nur über mehrere Anfragen verbunden mit UNION hinbekommen, aber das ist natürlich Mist. Ich habe an GROUP BY gedacht, aber ich schaffe es nicht, damit eine Abfrage zu bauen, die mir mein Ergebnis liefert.

Datenbank ist MySQL, Version weiß ich gerade nicht genau, denke 4.0.x

Vielen Dank schonmal.
Rocco

  1. Ich habe das bis jetzt nur über mehrere Anfragen verbunden mit UNION hinbekommen, aber das ist natürlich Mist.

    Warum? Für deinen Zweck mit hart definierten Kategorien ist das sicher nicht verkehrt.

    COUNT() reicht hier sicher aus, gruppieren ist imho nicht notwendig.

    Wie sehen denn deine "mehreren Abfragen" bisher aus?

    1. Hallo suit,

      Ich habe das bis jetzt nur über mehrere Anfragen verbunden mit UNION hinbekommen, aber das ist natürlich Mist.

      Warum? Für deinen Zweck mit hart definierten Kategorien ist das sicher nicht verkehrt.
      COUNT() reicht hier sicher aus, gruppieren ist imho nicht notwendig.

      UNION mit COUNT(*) dürfte in der Tat die einfachere Lösung sein. Sie könnte auch performanter sein als die von mir skizzierte Richtung mit einem CASE, in das die Kategorien ja auch hart definiert werden müssten.

      Freundliche Grüße

      Vinzenz

    2. Warum? Für deinen Zweck mit hart definierten Kategorien ist das sicher nicht verkehrt.

      o.g. Tabelle war ein stark vereinfachtes Beispiel. Es gibt noch andere Kategorien. Wenn ich dann 20 Kategorien habe brauche ich 20 mit UNION verbundene Abfragen. Das dauert lange, zumal das Datenbankdesign (für das ich nicht verantwortlich bin) unter aller Sau ist. Es müssen riesige Tabellen mit JOINS verbunden werden. Eine solche Abfrage dauert mit der UNION-Lösung 1 bis 2 Minuten... das geht so nicht!

      COUNT() reicht hier sicher aus, gruppieren ist imho nicht notwendig.

      Wie sehen denn deine "mehreren Abfragen" bisher aus?

      Wieder vereinfacht:

        
      (SELECT COUNT(`alter`) anzahl FROM tabelle WHERE `alter`>=0 AND `alter`<=10)  
      UNION ALL  
      (SELECT COUNT(`alter`) anzahl FROM tabelle WHERE `alter`>10 AND `alter`<=20)  
      UNION ALL  
      (SELECT COUNT(`alter`) anzahl FROM tabelle WHERE `alter`>20 AND `alter`<=30)  
      .  
      .  
      .  
      
      

      (u.s.w.)

      1. o.g. Tabelle war ein stark vereinfachtes Beispiel. Es gibt noch andere Kategorien. Wenn ich dann 20 Kategorien habe brauche ich 20 mit UNION verbundene Abfragen. Das dauert lange, zumal das Datenbankdesign (für das ich nicht verantwortlich bin) unter aller Sau ist. Es müssen riesige Tabellen mit JOINS verbunden werden. Eine solche Abfrage dauert mit der UNION-Lösung 1 bis 2 Minuten... das geht so nicht!

        Welchen Umfang hat die Datenbank aktuell?

        COUNT() reicht hier sicher aus, gruppieren ist imho nicht notwendig.

        Wie sehen denn deine "mehreren Abfragen" bisher aus?

        Wieder vereinfacht:
        [code lang=sql]
        (SELECT COUNT(alter) anzahl FROM tabelle WHERE alter>=0 AND alter<=10)
        UNION ALL
        (SELECT COUNT(alter) anzahl FROM tabelle WHERE alter>10 AND alter<=20)
        UNION ALL
        (SELECT COUNT(alter) anzahl FROM tabelle WHERE alter>20 AND alter<=30)

        fehlt also noch jeweils der Kategoriename:
        'Von 0 bis 10' as Kategorie

        Und ggf. solltest du den Rest noch auf BETWEEN umbauen.

        Das Performanceproblem kann ich nicht beurteilen.

        1. Welchen Umfang hat die Datenbank aktuell?

          Über Speicherumfang kann ich gerade nichts sagen, bin zuhause und das Problem auf der Arbeit. Dort sind auch - es ist mir ein bißchen peinlich - meine Zugangsdaten zu phpMyAdmin etc... ich kenne sie nicht auswendig ;-(
          Jedenfalls besteht die Datenbank aus hunderten Tabellen. Davon müssen für meine Abfrage 2-3 gejoint werden, jede davon hat etwa 50.000 records und etwa 100 columns, zudem ist keine vernünftige Indexierung vorhanden. Und ich betone nochmals, daß ich dafür nicht verantwortlich bin, aber ich muß halt damit arbeiten...

          fehlt also noch jeweils der Kategoriename:
          'Von 0 bis 10' as Kategorie

          Wie gesagt, das diente nur der Veranschaulichung. Bezeichnungen für Kategorien brauche ich im Ergebnis nicht.

          Und ggf. solltest du den Rest noch auf BETWEEN umbauen.

          Das werde ich mir dann auch mal anschauen...

          Danke schonmal!

          1. Jedenfalls besteht die Datenbank aus hunderten Tabellen. Davon müssen für meine Abfrage 2-3 gejoint werden, jede davon hat etwa 50.000 records und etwa 100 columns, zudem ist keine vernünftige Indexierung vorhanden. Und ich betone nochmals, daß ich dafür nicht verantwortlich bin, aber ich muß halt damit arbeiten...

            Hört sich nicht beeindruckend an und erklärt imho nicht, warum das 2 bis 3 Minuten dauern soll.

            ggf. ist MySQL 4.x einfach nur langsam ;)

            1. Hi,

              Jedenfalls besteht die Datenbank aus hunderten Tabellen. Davon müssen für meine Abfrage 2-3 gejoint werden, jede davon hat etwa 50.000 records und etwa 100 columns, zudem ist keine vernünftige Indexierung vorhanden. Und ich betone nochmals, daß ich dafür nicht verantwortlich bin, aber ich muß halt damit arbeiten...
              Hört sich nicht beeindruckend an und erklärt imho nicht, warum das 2 bis 3 Minuten dauern soll.

              Doch, das erklärt es schon, er schreibt doch explizit "zudem ist keine vernünftige Indexierung vorhanden"

              cu,
              Andreas

              --
              Warum nennt sich Andreas hier MudGuard?
              O o ostern ...
              Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        2. Und ggf. solltest du den Rest noch auf BETWEEN umbauen.

          Folgendes scheint zu funktionieren (zumindest hier zuhause):

            
          SELECT COUNT(*) anzahl, `alter` BETWEEN 0 AND 10 kat_0bis10, `alter` BETWEEN 11 AND 20 kat_11bis20, `alter` BETWEEN 21 AND 30 kat_21bis30  
          FROM tabelle  
          GROUP BY kat_0bis10, kat_11bis20, kat_21bis30  
          HAVING kat_0bis10=1 OR kat_11bis20=1 OR kat_21bis30=1  
          
          
          1. Hallo,

            Und ggf. solltest du den Rest noch auf BETWEEN umbauen.
            Folgendes scheint zu funktionieren (zumindest hier zuhause):

            Wenn Du es kompliziert machen willst ...

            SELECT COUNT(*) anzahl, alter BETWEEN 0 AND 10 kat_0bis10, alter BETWEEN 11 AND 20 kat_11bis20, alter BETWEEN 21 AND 30 kat_21bis30
            FROM tabelle
            GROUP BY kat_0bis10, kat_11bis20, kat_21bis30
            HAVING kat_0bis10=1 OR kat_11bis20=1 OR kat_21bis30=1

              
            ... so verwende wenigstens die WHERE-Klausel statt der HAVING-Klausel, wenn Du diejenigen aussortieren möchtest, die in keine Alterskategorie passen.  
              
            Sinnvoller ist es, hier statt x-Spalten eine einzige zu verwenden, wie von mir ursprünglich ins Spiel gebracht:  
              
            ~~~sql
            SELECT  
                CASE  
                    WHEN `alter` BETWEEN 0 AND 10 THEN 1  
                    WHEN `alter` BETWEEN 11 AND 20 THEN 2  
                    WHEN `alter` BETWEEN 21 AND 30 THEN 3  
                    WHEN `alter` BETWEEN 31 AND 40 THEN 4  
                    ELSE 5  
                END kategorie,  
                COUNT(`alter`) Anzahl  
            FROM  
                tabelle  
            GROUP BY  
                kategorie  
            ORDER BY  
                kategorie  
            
            

            MySQL gestattet die Verwendung von Aliasnamen sowohl in GROUP BY als auch in ORDER BY. [1]

            Was mir unklar ist, was diese Auswertung mit den 100 Spalten Deiner gejointen Tabellen zu tun hat. Von den 99 anderen Spalten außer "alter" interessieren ohnehin nur die für die Joins relevanten Spalten, die Du dennoch nicht in die Ergebnismenge mit aufnehmen musst.

            Freundliche Grüße

            Vinzenz

            [1] Andere DBMS sind da empfindlicher (z.B. MS SQL-Server).

            1. Sinnvoller ist es, hier statt x-Spalten eine einzige zu verwenden, wie von mir ursprünglich ins Spiel gebracht:

              SELECT

              CASE
                      WHEN alter BETWEEN 0 AND 10 THEN 1
                      WHEN alter BETWEEN 11 AND 20 THEN 2
                      WHEN alter BETWEEN 21 AND 30 THEN 3
                      WHEN alter BETWEEN 31 AND 40 THEN 4
                      ELSE 5
                  END kategorie,
                  COUNT(alter) Anzahl
              FROM
                  tabelle
              GROUP BY
                  kategorie
              ORDER BY
                  kategorie

              
              > [MySQL gestattet die Verwendung von Aliasnamen](http://dev.mysql.com/doc/refman/5.1/en/problems-with-alias.html) sowohl in GROUP BY als auch in ORDER BY. [1]  
                
              Genauso habe ich es in den letzten 20 Minuten auch gemacht ;-) Siehe Antwort auf Deinen Beitrag ;-) Klappt prima!  
                
              
              > Was mir unklar ist, was diese Auswertung mit den 100 Spalten Deiner gejointen Tabellen zu tun hat. Von den 99 anderen Spalten außer "alter" interessieren ohnehin nur die für die Joins relevanten Spalten, die Du dennoch nicht in die Ergebnismenge mit aufnehmen musst.  
                
              Naja, zugegeben, die Gründe für die Perfomanceprobleme habe ich mir so zusammengereimt. Ich bin da wahrlich kein Experte, woran kann es liegen? MySQL-Version?
              
  2. Hallo,

    Vereinfacht:

    id | Alter

    1    15
    2    23
    3    25
    4     7

    Nun möchte ich gerne zählen, wie viele Personen verschiedenen Alterskategorien zugehörig sind, z.B. 0 bis 10, 11 bis 20 etc.
    Ergebnis soll also etwa so aussehen:

    Kategorie | Anzahl

    0 bis 10      1
    11 bis 20      1
    21 bis 30      2

    Ich habe an GROUP BY gedacht,

    das ist in Ordnung, genau das benötigst Du. Deine Kategorien bekommst Du über ein entsprechendes

    CASE
        WHEN [condition] THEN result
        [WHEN [condition] THEN result ...]
        [ELSE result]
    END

    Zähle die Datensätze und gruppiere nach dem Ergebnis des CASE-Ausdrucks.
    Ganz sicher willst Du die Kategorien (Dein CASE-Ausdruck) aufsteigend durchzählen und nach den Kategorien sortieren.

    Datenbank ist MySQL, Version weiß ich gerade nicht genau, denke 4.0.x

    Falls sie wirklich so alt sein sollte, wäre das für Dein Vorhaben nicht hinderlich, aber ansonsten ziemlich übel. Selbst für 5.0 ist Entwicklung und normaler Support eingestellt.

    Freundliche Grüße

    Vinzenz

    1. CASE
          WHEN [condition] THEN result
          [WHEN [condition] THEN result ...]
          [ELSE result]
      END

      Interessant, mit CASE habe ich noch nicht gearbeitet, das schaue ich mir mal an.

      Falls sie wirklich so alt sein sollte, wäre das für Dein Vorhaben nicht hinderlich, aber ansonsten ziemlich übel. Selbst für 5.0 ist Entwicklung und normaler Support eingestellt.

      Ist klar, leider sind das die Gegebenheiten auf der Arbeit, die ich - zumindest im Moment - nicht ändern kann :-(

      Danke erstmal!

    2. CASE
          WHEN [condition] THEN result
          [WHEN [condition] THEN result ...]
          [ELSE result]
      END

      Zähle die Datensätze und gruppiere nach dem Ergebnis des CASE-Ausdrucks.
      Ganz sicher willst Du die Kategorien (Dein CASE-Ausdruck) aufsteigend durchzählen und nach den Kategorien sortieren.

      Folgendes funktioniert ganz prächtig (jedenfalls bei mir zuhause mit MySQL 5.0.51a):

        
      SELECT  
        CASE  
         WHEN `alter` BETWEEN 0 AND 10 THEN 'kat_0bis10'  
         WHEN `alter` BETWEEN 11 AND 20 THEN 'kat_11bis20'  
         WHEN `alter` BETWEEN 21 AND 30 THEN 'kat_21bis30'  
         ELSE 'ungültig'  
        END  
        AS kategorie,  
        COUNT(*) anzahl  
      FROM tabelle  
      GROUP BY kategorie  
      ORDER BY kategorie  
      
      

      Wird gleich am Dienstag auf der Arbeit ausprobiert!

      Vielen Dank!

  3. Warum ist hierauf noch keiner gekommen?
    IMHO die eleganteste und einfachste Lösung.
    SELECT count(*) AS Anzahl, FLOOR(Alter/10) * 10 AS x FROM wuz GROUP BY x

    --
    for your security, this text has been encrypted by ROT13 twice.
    1. Warum ist hierauf noch keiner gekommen?
      IMHO die eleganteste und einfachste Lösung.
      SELECT count(*) AS Anzahl, FLOOR(Alter/10) * 10 AS x FROM wuz GROUP BY x

      Die eleganteste Lösung ist nicht immer die am einfachsten verständlichste oder Performanteste Lösung ;)

      Siehe Refuctoring.

      1. Die eleganteste Lösung ist nicht immer die am einfachsten verständlichste oder Performanteste Lösung ;)

        Du findest das hier:

          
                    SELECT  
                      CASE  
                       WHEN `Alter` BETWEEN 0 AND 10 THEN 'kat_0bis10'  
                       WHEN `Alter` BETWEEN 11 AND 20 THEN 'kat_11bis20'  
                       WHEN `Alter` BETWEEN 21 AND 30 THEN 'kat_21bis30'  
                       WHEN `Alter` BETWEEN 31 AND 40 THEN 'kat_31bis40'  
                       WHEN `Alter` BETWEEN 41 AND 50 THEN 'kat_41bis50'  
                       WHEN `Alter` BETWEEN 51 AND 60 THEN 'kat_51bis60'  
                       WHEN `Alter` BETWEEN 61 AND 70 THEN 'kat_61bis70'  
                       WHEN `Alter` BETWEEN 71 AND 80 THEN 'kat_71bis80'  
                       WHEN `Alter` BETWEEN 81 AND 90 THEN 'kat_81bis90'  
                       WHEN `Alter` BETWEEN 91 AND 100 THEN 'kat_91bis100'  
                       ELSE 'ungültig'  
                      END  
                      AS kategorie,  
                      COUNT(*) anzahl  
                    FROM tabelle  
                    GROUP BY kategorie  
                    ORDER BY kategorie  
        
        

        ernsthaft besser lesbar als das hier?

          
        SELECT  
        count(*) AS Anzahl, FLOOR(Alter/$groupSize) * $groupSize AS Kategorie  
        FROM tabelle  
        GROUP BY kategorie  
        ORDER BY kategorie  
        
        

        Abgesehen davon dass meine Variante sehr viel flexibler (es kann auch Leute geben die 1000 Jahre alt sind) und leichter zu warten ist. ($groupsize ändern, schon ist die Kategoriegröße und damit die Anzahl der Kategorien geändert)

        --
        for your security, this text has been encrypted by ROT13 twice.
        1. Mahlzeit zaphod1984,

          Du findest das hier:
          [...]
          ernsthaft besser lesbar als das hier?
          [...]

          Also ich: ja.

          Es ist mehr Code - aber auf den ersten Blick verständlicher.

          Und da Rocco ja offenbar sowieso eine flexiblere Lösung benötigt, ist das in diesem Fall IMHO auch die bessere Lösung.

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          1. Und da Rocco ja offenbar sowieso eine flexiblere Lösung benötigt, ist das in diesem Fall IMHO auch die bessere Lösung.

            Bin ich mir bewusst, aber weder die Fragestellung im Eingangspost wies darauf hin, noch zielte dir Formulierung deines vorherigen Statements auf den flexiblen Charakter der Lösung sondern rein auf Einfachheit, Verständlichkeit und Performance. :P

            --
            for your security, this text has been encrypted by ROT13 twice.
        2. Moin!

          Die eleganteste Lösung ist nicht immer die am einfachsten verständlichste oder Performanteste Lösung ;)

          Du findest das hier:

          SELECT
                        CASE
                         WHEN Alter BETWEEN 0 AND 10 THEN 'kat_0bis10'
                         WHEN Alter BETWEEN 11 AND 20 THEN 'kat_11bis20'
                         WHEN Alter BETWEEN 21 AND 30 THEN 'kat_21bis30'
                         WHEN Alter BETWEEN 31 AND 40 THEN 'kat_31bis40'
                         WHEN Alter BETWEEN 41 AND 50 THEN 'kat_41bis50'
                         WHEN Alter BETWEEN 51 AND 60 THEN 'kat_51bis60'
                         WHEN Alter BETWEEN 61 AND 70 THEN 'kat_61bis70'
                         WHEN Alter BETWEEN 71 AND 80 THEN 'kat_71bis80'
                         WHEN Alter BETWEEN 81 AND 90 THEN 'kat_81bis90'
                         WHEN Alter BETWEEN 91 AND 100 THEN 'kat_91bis100'
                         ELSE 'ungültig'
                        END
                        AS kategorie,
                        COUNT(*) anzahl
                      FROM tabelle
                      GROUP BY kategorie
                      ORDER BY kategorie

          
          > ernsthaft besser lesbar als das hier?  
          > ~~~sql
            
          
          > SELECT  
          > count(*) AS Anzahl, FLOOR(Alter/$groupSize) * $groupSize AS Kategorie  
          > FROM tabelle  
          > GROUP BY kategorie  
          > ORDER BY kategorie  
          > 
          
          

          Abgesehen davon dass meine Variante sehr viel flexibler (es kann auch Leute geben die 1000 Jahre alt sind) und leichter zu warten ist. ($groupsize ändern, schon ist die Kategoriegröße und damit die Anzahl der Kategorien geändert)

          Nein, flexibler ist deine Lösung nicht.

          Wie würdest du beispielsweise die Gruppierung machen, wenn

          • Kinder unter 16 gar nicht gezählt werden sollen,
          • Leute zwischen 16 und 39 Jahren in eine Gruppe (die "werberelevante Zielgruppe")
          • Leute zwischen 40 und 65 in eine zweite Gruppe
          • Leute über 65 in eine dritte Gruppe kommen sollen.

          Da ist das längliche CASE-Template bestens drauf vorbereitet, deine Rechenversion hingegen scheitert.

          Ich bin nicht unbedingt ein Freund von länglicher Applikations-Logik in SQL-Abfragen, aber diese Kategorien-Einordnung ließe sich relativ leicht auch dynamisch aus der irgendwo gespeicherten Kategorisierungs-Vorschrift erzeugen und so beliebig anpassen - und sie wäre dann kein fester Bestandteil des SQL. :)

          - Sven Rautenberg

          1. Nein, flexibler ist deine Lösung nicht.

            Wie würdest du beispielsweise die Gruppierung machen, wenn
            [...]

            Da ist das längliche CASE-Template bestens drauf vorbereitet, deine Rechenversion hingegen scheitert.

            Jepp, hatte ich ja schon erwähnt dass in diesem Fall die Rechenmethode nicht funktioniert.
            Aber bitte keine CASE-Statements wenn es mal eine Verteilung auf gleichgroße Kategorien geben soll, da was dran zu ändern ist Schmerzen im A*sch.

            --
            for your security, this text has been encrypted by ROT13 twice.
    2. Hallo,

      Warum ist hierauf noch keiner gekommen?
      IMHO die eleganteste und einfachste Lösung.
      SELECT count(*) AS Anzahl, FLOOR(Alter/10) * 10 AS x FROM wuz GROUP BY x

      ich hab' beruflich mit Alterskategorien zu tun, wo sowas Einfaches nicht passt und ich ging von einer Vereinfachung einer ähnlichen Problemstellung aus.

      Freundliche Grüße

      Vinzenz

    3. Warum ist hierauf noch keiner gekommen?
      IMHO die eleganteste und einfachste Lösung.
      SELECT count(*) AS Anzahl, FLOOR(Alter/10) * 10 AS x FROM wuz GROUP BY x

      Auch schön,
      leider für meine Zwecke nicht zu gebrauchen, da ich noch andere Kategorien neben dem Alter brauche, viele davon nicht linear.

      Danke trotzdem!

      1. okay, das ließ deine fragestellung nicht vermuten...

        --
        for your security, this text has been encrypted by ROT13 twice.
  4. moin,

    ich habe eine Tabelle, in der u.a. das Alter von Personen gespeichert ist.

    handelt es sich um eine OLAP Datenbank oder sind diese menschen schon alle tot, performanceprobleme oder welchen grund gibt es, das alter anstelle das geburtsdatum zu persistieren ?

    Ilja

  5. Hallo mal wieder,

    nachdem mir ja bereits sehr nett und kompetent geholfen wurde, schließt sich gleich die nächste Herausforderung bei diesem NEUEN PROBLEM an:

    Folgende Tabelle ist vorhanden (Beispiel):

    id | Alter
    ----------
     1    15
     2    23
     3    25
     4     7
     5    42

    Gewünscht ist eine Kategorisierung, dies geschieht mit folgender Abfrage:

      
    SELECT  
      CASE  
       WHEN `alter` BETWEEN 0 AND 10 THEN 'kat_0bis10'  
       WHEN `alter` BETWEEN 11 AND 20 THEN 'kat_11bis20'  
       WHEN `alter` BETWEEN 21 AND 30 THEN 'kat_21bis30'  
       WHEN `alter` BETWEEN 31 AND 40 THEN 'kat_31bis40'  
       WHEN `alter` BETWEEN 41 AND 50 THEN 'kat_41bis50'  
       ELSE 'ungültig'  
      END  
      AS kategorie,  
      COUNT(*) anzahl  
    FROM tabelle  
    GROUP BY kategorie  
    ORDER BY kategorie  
    
    

    Ich erhalte - völlig korrekt und logisch - folgende Ausgabe

    kategorie | anzahl
    ------------------
    kat_0bis10     1
    kat_11bis20    1
    kat_21bis30    2
    kat_41bis50    1

    Wie erhalte ich folgende Ausgabe?

    kategorie | anzahl
    ------------------
    kat_0bis10     1
    kat_11bis20    1
    kat_21bis30    2
    kat_31bis40    0  <--- '0' soll ausgegeben werden!
    kat_41bis50    1

    Habe mich jetzt über 3 Stunden durch Manuals und Foren geklickt und alles was ich probiert habe hat nicht geklappt. Daher wäre ich für neuerliche Hilfe äußerst dankbar!

    Datenbank: MySQL 4.0.27 :-(

    Gruß
    Rocco

    1. moin,

      mal unabhängig von deinem problem, gibt es einen bestimmten grund, warum du das alter und nicht das geburstagsdatum speicherst ?

      Ilja

      1. moin,

        mal unabhängig von deinem problem, gibt es einen bestimmten grund, warum du das alter und nicht das geburstagsdatum speicherst ?

        Ilja

        Die Daten werden von Dritten in HTML-Formulare eingetragen und dann in die Datenbank geschrieben. In diesem Formularen ist die Eingabe des Alters vorgesehen. Das Geburtsdatum entzieht sich also meiner Kenntnis...

        1. moin,

          Die Daten werden von Dritten in HTML-Formulare eingetragen und dann in die Datenbank geschrieben. In diesem Formularen ist die Eingabe des Alters vorgesehen. Das Geburtsdatum entzieht sich also meiner Kenntnis...

          ok, vielleicht wäre es gut, denen mal eine rückmeldung zu geben, dass das alter nicht immer optimal ist, hängt aber auch immer ein wenig von dem anwedungsfall ab.

          aber zu deinem problem, man hat verschiedene möglichkeiten, informationen zu gewinnen, die eigentlich nicht in der datenbank stehen. zum einen kannst du es im SQL statement hat Coden. zum anderen, und das wäre mein vorschlag, du erzeugt eine Def tabelle, in dem du alle Alterskategorien speichest, die es gibt, dort legst du auch die grenzen ab:

          Name | StartAlter | EndAlter
          kat1;1;10
          kat2;11;20
          kat3;21;30

          usw. Wenn du die tabelle hast, kannst du beiden Tabellen mit einem OUTER JOIN verbinden. dann kannst du dir zu einen das harte CASE konstrukt in der abfrage sparen und zum anderen bekommst du auch die alterkategorien, die keinen treffer haben.

          Ilja