[SQL] Alters Diagramm

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Fuselmeister, 13. Januar 2011 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 13. Januar 2011
    Alters Diagramm

    Hi, ich wollte mal eine Statistik über das Alter der User erstellen. Bis jetzt hab gibt der mir aus wie viele User eines Alters es gibt:
    Code:
    SELECT COUNT(id) as anzahl,(YEAR(CURDATE())-YEAR(bday)) - (RIGHT(CURDATE(),5)<RIGHT(bday,5)) AS `alter` FROM user GROUP BY `alter` ORDER BY `alter`
    Allerding möchte ich Altersklassen haben. Also, dass der die Datensätze in Gruppen von 0-10,11-20,21-30,31-40,41-50 usw. einteilt. Im Handbuch hab ich unter GROUP BY nichts passendes gefunden.

    Einer ne Idee?
     
  2. 13. Januar 2011
    AW: Alters Diagramm

    Google Hilft, bitteschön

    sql server - In SQL, how can you group by in ranges? - Stack Overflow
     
  3. 13. Januar 2011
    AW: Alters Diagramm

    hast du es schon mit where bedigung versucht?

    PHP:
    WHERE  'alter'  AND  'alter'  10
     
  4. 13. Januar 2011
    AW: Alters Diagramm

    Dann hat er aber noch lange keine Gruppierung? In dem Fall sind case Anweisungen wohl die bessere Wahl.
     
  5. 13. Januar 2011
    AW: Alters Diagramm

    thx
    ich hab jetzt das hier von stackoverflow probiert
    PHP:
    select t . range  as [ score range ],  count (*) as [ number of occurences ]
    from  (
          
    select user_id ,
             case 
    when score  >=  and  score 10 then  '0-9'
             
    when score  >=  10  and  score 20 then  '10-19'
             
    else  '20-99'  end  as  range
         from scores
    t
    group by t
    . range
    mein problem ist, was soll ich an den stellen wo "t" steht für eine tabelle angeben? so ganz blicke ich da auch nich durch^^ in SQL hab ich mich noch nich soo intensiv eingearbeitet... mehr so die basics

    so siehts bei mir gerade aus:
    PHP:
    select range , count (*) as  cnt
    from 
    (
      
    select id
       
    case  when  ( YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) >=  0   and
                 (
    YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) <   10
                 then 
    '0-9'
            
    when  ( YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) >=  10  and
                 (
    YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) <   20
                 then 
    '10-19'
            
    when  ( YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) >=  20  and
                 (
    YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) <   30
                 then 
    '20-29'
            
    when  ( YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) >=  30  and
                 (
    YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) <   40
                 then 
    '30-39'
            
    when  ( YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) >=  40  and
                 (
    YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) <   50
                 then 
    '40-49'    
            
    when  ( YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) >=  60  and
                 (
    YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) <   70
                 then 
    '60-69'
            
    when  ( YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) >=  70  and
                 (
    YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) <   80
                 then 
    '70-79'
            
    when  ( YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) >=  80  and
                 (
    YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) <   90
                 then 
    '80-89'
            
    when  ( YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) >=  90  and
                 (
    YEAR ( CURDATE ())- YEAR ( bday )) - ( RIGHT ( CURDATE (), 5 )< RIGHT ( bday , 5 )) <   100
                 then 
    '90-99'
            
    else  '100+'  end  as  range from angler ) ???
    group by range
    da wo die 3 fragezeichen stehen weiss ich halt nicht was ich einsetzten soll. ne variable für das alter muss ich später noch einbauen...
     
  6. 20. Januar 2011
    AW: Alters Diagramm

    So hab jetzt die Schnauze voll. Ich lass mir einfach die Tabelle mit dem Alter ausgeben und PHP klassiert dann^^ SQL muss ja auch nicht immer für alles herhalten
     
  7. 20. Januar 2011
    AW: Alters Diagramm

    Mein Tipp:

    Statt:
    PHP:
    select range , count (*) as  cnt 
    Dies:
    PHP:
    select tmnp . range , count (*) as  cnt 
    Statt:
    PHP:
    ???
    Dies:
    PHP:
    tmp
    Statt:
    PHP:
    range
    Dies:
    PHP:
    tmp . range
    "tmp" gibt den Namen der "imaginären Tabelle" an, die via CASE und Subselect "erstellt" wird.
    So funktioniert es jedenfalls bei mir - mit einer Test-Tabelle.
     
  8. 20. Januar 2011
    AW: Alters Diagramm

    Thx habs mal ausprobiert, aber ich bekomm nur ne fehlermeldung von wegen syntax fehler... evtl. is das ne falscher Server version?
     
  9. 20. Januar 2011
    AW: Alters Diagramm

    dein datenbanklayout ist ja mal .

    erstelle zwei tabellen
    1. ranges (die altersgruppen)
    2. data (die daten)

    dann kannst du in der tabelle "data" einfach eine range-id zuweisen die du in einem WHERE ausdruck selektieren kannst.

    Code:
    CREATE TABLE `ranges` (
     `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     `group` VARCHAR(25) NOT NULL,
     INDEX (`group`)
    );
    
    CREATE TABLE `data` (
     `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     `range-id` INT NOT NULL,
     `was-du-sonst-noch-so-brauchst ...`,
     INDEX (`range-id`)
    );
    beispiel:

    Code:
    SELECT *
    FROM `data` d,
    LEFT JOIN `ranges` r ON ( d.`range-id` = r.`id` )
    WHERE r.`group` = '10-19'
    und dieses hässliche case/when lagerst du am besten in eine funktion aus (ja in mysql)

    Code:
    SET GLOBAL log_bin_trust_function_creators = ON
    
    CREATE FUNCTION get_date_range (datestr CHAR(100)) RETURNS CHAR(7)
    BEGIN
     DECLARE date_year INT DEFAULT 0;
     
     SET date_year = (YEAR(CURDATE()) - YEAR(datestr)) - (RIGHT(CURDATE() ,5) < RIGHT(datestr, 5));
     SET date_year = date_year - (date_year % 10);
     
     RETURN CONCAT(date_year, "-", date_year + 9);
    END
    daraus ergibt sich dann folgender query (übersicht++)
    Code:
    SELECT *
    FROM `data` d,
    LEFT JOIN `ranges` r ON ( d.`range-id` = r.`id` )
    WHERE r.`group` = get_date_range('1987-9-29')
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.