Я хочу отобразить сводку, подобную этой, на основе трех таблиц - PullRequest
0 голосов
/ 11 ноября 2018

Мои 3 таблицы MYSQL выглядят следующим образом:

Таблица 1: гражданин

=============================
ID |  Name | Sex    | Address |
=============================
5  | James | Male   | India
6  | Shella|Female  | India
7  | Jan   | Male   | NY
8  | May   | Female | USA
==============================

Таблица 2: преимущества

========================== 
ID| benefits
==========================
1 | SSS
2 | Coco Life
3 | PhiHealth
4 | Sunlife
==========================

Таблица 3: пенсионеры

============================
ID| benefits_ID | citizen_ID
============================
1 | 1           | 5
2 | 2           | 6
3 | 1           | 7
4 | 4           | 7
==========================

Я хочу отобразить это так:

====================================================================
Address | Total Citizen | Male | Female | SSS | Coco Life | Others |
====================================================================
India   | 2             |  1   |  1     |  1  |    1      |   0    |
NY      | 1             |  1   |  0     |  1  |    0      |   1    |
USA     | 1             |  0   |  1     |  0  |    0      |   0    | 
==================================================================

Кто-нибудь может дать мне подсказку, как это сделать?

1 Ответ

0 голосов
/ 11 ноября 2018

Вы можете сделать Left Join из таблицы Address в таблицу benefits, через таблицу pensioners, используя соответствующие отношения. Левое объединение позволяет нам рассматривать Address, даже если нет соответствующей записи benefits ни для одного из его граждан.

Чтобы подсчитать общее количество граждан, мужчин и женщин, вам теперь нужно использовать COUNT(DISTINCT ID) после объединения. Поскольку присоединение может создавать повторяющиеся строки, у гражданина может быть несколько преимуществ.

Кроме того, чтобы подсчитать «Прочие» льготы, мы должны убедиться, что benefit IS NOT NULL и NOT IN ('SSS', 'Coco Life').

В многостоловых запросах рекомендуется использовать Псевдоним для ясности кода (удобочитаемости) и избежания неоднозначного поведения.

SELECT  
  c.Address,
  COUNT(DISTINCT CASE WHEN c.Sex = 'Male' THEN c.ID END) AS male_cnt,
  COUNT(DISTINCT CASE WHEN c.Sex = 'Female' THEN c.ID END) AS female_cnt,
  COUNT(DISTINCT c.ID) AS total_citizen_cnt, 
  COUNT(CASE WHEN b.benefits = 'SSS' THEN 1 END) AS SSS_cnt, 
  COUNT(CASE WHEN b.benefits = 'Coco Life' THEN 1 END) AS Coco_Life_cnt, 
  COUNT(CASE WHEN b.benefits IS NOT NULL AND 
                  b.benefits NOT IN ('SSS', 'Coco Life') THEN 1 END) AS Others_cnt 
FROM citizen AS c 
LEFT JOIN pensioners AS p
  ON p.citizen_ID = c.ID 
LEFT JOIN benefits AS b 
  ON b.ID = p.benefits_ID 
GROUP BY c.Address
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...