phpbar.de logo

Mailinglisten-Archive

Re: Select in Gruppen
Archiv Mailingliste mysql-de

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Select in Gruppen



On Fri, 2 Feb 2001, Andre Krajnik wrote:

> Ich habe u.a. eine Datenbank mit Personendaten. Ich möchte nun einen
> Select starten, der mir die Altersverteilung ausgibt.
>
> Also als Beispiel:
>  unter 18
>  18 - 29
>  30 - 39
>  40 - 49
>  50 - 59
>  60 - 65
>  über 65
>
> Ist so etwas möglich? Wenn ja, wie? Mich interessieren
> a) nur die Anzahl  - count(weiblich/männlich)
> b) die Namen (in einem 2. Select)

Hallo!

Beispielstabelle:

mysql> select * from people;
+-----------+------+------+
| name      | age  | sex  |
+-----------+------+------+
| Kaj       |   37 | M    |
| Monty     |   38 | M    |
| My        |   13 | F    |
| Zwanzig   |   20 | M    |
| Zwanzig F |   20 | F    |
| Siebzig   |   70 | F    |
| Vierzig   |   40 | M    |
| Vierzig F |   40 | F    |
| Fünfzig   |   50 | F    |
| Sechzig   |   60 | M    |
| Sechzig F |   60 | F    |
| Fünfzig 2 |   50 | F    |
+-----------+------+------+
12 rows in set (0.00 sec)

a)
mysql> SELECT
    ->  case when age<18 then "unter 18"
    ->       when age<30 then "18-29"
    ->       when age<40 then "30-39"
    ->       when age<50 then "40-49"
    ->       when age<60 then "50-59"
    ->       when age<66 then "60-65"
    ->       else "über 65" end as Gruppe,
    ->       sum(If(sex="M",1,0)) as Männer,
    ->       sum(If(sex="F",1,0)) as Frauen,
    ->       count(*) As Total
    -> FROM people
    -> GROUP BY Gruppe
    -> order by case when age<18 then 1 else 2 end,1;
+----------+--------+--------+-------+
| Gruppe   | Männer | Frauen | Total |
+----------+--------+--------+-------+
| unter 18 |      0 |      1 |     1 |
| 18-29    |      1 |      1 |     2 |
| 30-39    |      2 |      0 |     2 |
| 40-49    |      1 |      1 |     2 |
| 50-59    |      0 |      2 |     2 |
| 60-65    |      1 |      1 |     2 |
| über 65  |      0 |      1 |     1 |
+----------+--------+--------+-------+
7 rows in set (0.00 sec)

Der ORDER BY sortiert erst die Kategorie "unter 18",
danach mit ",1" in alfabetischer Reihenfolge nach dem
ersten Select-Feld, und zwar Gruppe. Ohne den etwas
komischen ORDER BY kommt "unter 18" nach "60-65".

b)
mysql> SELECT
    ->  case when age<18 then "unter 18"
    ->       when age<30 then "18-29"
    ->       when age<40 then "30-39"
    ->       when age<50 then "40-49"
    ->       when age<60 then "50-59"
    ->       when age<66 then "60-65"
    ->       else "über 65" end as Gruppe,
    ->       name
    -> FROM people
    -> order by case when age<18 then 1 else 2 end,1;
+----------+-----------+
| Gruppe   | name      |
+----------+-----------+
| unter 18 | My        |
| 18-29    | Zwanzig   |
| 18-29    | Zwanzig F |
| 30-39    | Kaj       |
| 30-39    | Monty     |
| 40-49    | Vierzig   |
| 40-49    | Vierzig F |
| 50-59    | Fünfzig   |
| 50-59    | Fünfzig 2 |
| 60-65    | Sechzig   |
| 60-65    | Sechzig F |
| über 65  | Siebzig   |
+----------+-----------+
12 rows in set (0.00 sec)

Gruß,

Kaj
-- 
 mysql_(at)_polycon.fi
 http://www.polycon.fi/mysql/

---
*** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql 


Home | Main Index | Thread Index

php::bar PHP Wiki   -   Listenarchive