2017-01-02 46 views
1

我有這張表包含關於orgin,出生,公民身份和性別國家數據的人。在加入和組結果中計算字段結果在表中

PEOPLE 
+-----------------------+--------------+------+-----+---------+----------------+ 
| Field     | Type   | Null | Key | Default | Extra   | 
+-----------------------+--------------+------+-----+---------+----------------+ 
| id     | int(11)  | NO | PRI | NULL | auto_increment | 
| name     | varchar(200) | YES |  | NULL |    | 
| surname    | varchar(200) | YES |  | NULL |    | 
| sex     | varchar(1) | YES |  | NULL |    | 
| idNatBirth   | int(11)  | YES | MUL | NULL |    | 
| idNatOrigin   | int(11)  | YES | MUL | NULL |    | 
| idNatCitizen   | int(11)  | YES | MUL | NULL |    | 
+-----------------------+--------------+------+-----+---------+----------------+ 

各IDS(出生,出身,國籍)被加入到國家表:

NATIONS 
+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| code  | bigint(20) | YES |  | NULL |    | 
| description | varchar(100) | YES |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 

我還沒有得到這三個表由國家計數的人。 對於三個國家領域相同的模型。這是出生:

select people.idNatBirth, nations.*, count(*) FROM people 
INNER JOIN nations 
ON nations.id = people.idNatBirth 
GROUP BY nations.description; 

+------------------+-----+--------+-------------+----------+ 
| idNatBirth  | id | code | description | count(*) | 
+------------------+-----+--------+-------------+----------+ 
|    133 | 133 |  1 | AFGHANISTAN |  43 | 
|    193 | 193 |  61 | IRAQ  |  139 | 
|    219 | 219 |  87 | PAKISTAN |  59 | 
|    238 | 238 | 106 | SIRIA  |  161 | 
+------------------+-----+--------+-------------+----------+ 

但我需要一個更復雜的結果,顯示每一個計數的出生,出身,國籍和性別分佈。 類似的東西:

+------------------------+----------+------------+----------+------------+------------+-----------+------------+ 
| description   | birth | birthMale | birthFem | origin  | originMale | originFem | citizenship etc .....  
+------------------------+----------+------------+----------+------------+------------+-----------+------------+ 
| AFGHANISTAN   |  43 |   20 |  23 |   40 |   20 |  20 | .... 
| IRAQ     |  139 |   39 |  100 |   29 |   9 |  20 | .... 
| PAKISTAN    |  59 |   50 |  9 |   10 |   9 |   1 | .... 
| SIRIA     |  161 |   61 |  100 |  102 |   2 |  100 | .... 
| ALBANIA    |  0 |   0 |  0 |   12 |   10 |   2 | .... 
| SOMALIA    |  0 |   0 |  0 |  ... 
... 
... 

正如你所看到並不是每一個國家存在於人表... 每場就如何實現這一目標的任何想法? 在此先感謝。 這是百姓餐桌的樣本數據:

+----+------------+------------+-------+------------------+----------------------+-----------------------+ 
| id | name  | surname | sex | idNatBirth  | idNatOrigin   | idNatCitizen   | 
+----+------------+------------+-------+------------------+----------------------+-----------------------+ 
| 1 | name  | surname | M  |    133 |     NULL |     NULL | 
| 2 | AUTOS1  | AUTOS2  | M  |    133 |     NULL |     NULL | 
| 3 | Johari  | JAI  | F  |    193 |     238 |     193 | 
| 4 | Bejide  | RAI  | F  |    193 |     193 |     193 | 
| 5 | Sema  | DARSHA  | M  |    238 |     238 |     238 | 
| 6 | Kefilwe | LATA  | M  |    219 |     219 |     219 | 
| 7 | Kali  | RAJAN  | M  |    238 |     238 |     238 | 
| 8 | Tanginika | SAXENA  | F  |    193 |     193 |     193 | 
| 9 | Marahaba | CHAUHAN | M  |    238 |     238 |     238 | 
| 10 | Malkia  | PATEL  | M  |    238 |     238 |     238 | 
| 11 | Makena  | DHAWAN  | F  |    193 |     193 |     193 | 
| 12 | Dziko  | NARAYAN | M  |    238 |     238 |     238 | 
| 13 | Anaya  | NEEL  | M  |    193 |     193 |     193 | 
| 14 | Yahminah | SANDEEP | M  |    238 |     238 |     238 | 
| 15 | Iruwa  | SEN  | M  |    219 |     219 |     219 | 
| 16 | Abena  | MATI  | M  |    133 |     133 |     133 | 
| 17 | Obax  | BHATT  | M  |    193 |     193 |     193 | 
| 18 | Bikilu  | NATH  | F  |    133 |     133 |     133 | 
| 19 | Mumbi  | SRINI  | M  |    219 |     219 |     219 | 
| 20 | Wanjiko | MANJU  | M  |    193 |     238 |     193 | 
+----+------------+------------+-------+------------------+----------------------+-----------------------+ 
+0

你能否提供一些來自'人'表的樣本數據? – Viki888

+0

謝謝! 剛剛編輯我的帖子... –

回答

0

你可以試試下面

SELECT description, 
     SUM(birth)  birth, 
     SUM(birthmale) birthMale, 
     SUM(birthfem) birthFem, 
     SUM(origin)  origin, 
     SUM(originmale) originMale, 
     SUM(originfem) originFem, 
     SUM(citizenship) citizenship, 
     SUM(citizenmale) citizenMale, 
     SUM(citizenfem) citizenFem 
FROM (SELECT CASE 
       WHEN n.id IS NOT NULL THEN n.description 
       WHEN org.id IS NOT NULL THEN org.description 
       WHEN cit.id IS NOT NULL THEN cit.description 
       END  description, 
       SUM(CASE WHEN n.id IS NOT NULL THEN 1 ELSE 0 END) AS birth, 
       SUM(CASE WHEN n.id IS NOT NULL AND people.sex = 'M' THEN 1 ELSE 0 END) birthmale, 
       SUM(CASE WHEN n.id IS NOT NULL AND people.sex = 'F' THEN 1 ELSE 0 END) birthFem, 
       SUM(CASE WHEN org.id IS NOT NULL THEN 1 ELSE 0 END) AS origin, 
       SUM(CASE WHEN org.id IS NOT NULL AND people.sex = 'M' THEN 1 ELSE 0 END) originmale, 
       SUM(CASE WHEN org.id IS NOT NULL AND people.sex = 'F' THEN 1 ELSE 0 END) originFem, 
       SUM(CASE WHEN cit.id IS NOT NULL THEN 1 ELSE 0 END) AS citizenship, 
       SUM(CASE WHEN cit.id IS NOT NULL AND people.sex = 'M' THEN 1 ELSE 0 END) citizenmale, 
       SUM(CASE WHEN cit.id IS NOT NULL AND people.sex = 'F' THEN 1 ELSE 0 END) citizenFem 
     FROM people 
       LEFT JOIN nations n 
        ON n.id = people.idnatbirth 
       LEFT JOIN nations org 
        ON org.id = people.idnatorigin 
       LEFT JOIN nations cit 
        ON cit.id = people.idnatcitizen 
     GROUP BY n.id, 
       org.id, 
       cit.id, 
       n.description, 
       org.description, 
       cit.description)t1 
GROUP BY description; 

希望這會幫助你。這實在是一個簡單的查詢。格式化查詢顯示它像一個惡魔查詢。

+0

幾乎在那裏!謝謝! 唯一的問題是結果只涉及各個領域的國家。 –

+0

幾乎在那裏!謝謝! 問題是,查詢實際上只列出出現在每個領域的國家:所以我看不到,例如,一個國家出現在公民領域... 我需要看到每個國家有關的任何三字段... –

+0

@ Miss-Take您是否有該場景的樣本數據?如果非常好的更新問題,請告訴我。 – Viki888