2015-03-23 1 views
1

У меня есть две таблицы, как так:сосчитать, сколько раз пациент (женщины и мужчины) получили консультации в первый раз и сколько приходят впоследствии

Table Pacient 
--------------------- 
id| name  |sex| 
01| george |m | 
02| laura |f | 
03| holly |f | 
04| bill  |m | 
05| gene  |m | 
06| elizabeth|f | 
--------------------- 

Table Consulting 
------------------------ 
id|diagnostic|id_pacient 
01| random |01 
02| random |02 
03| random |04 
04| random |01 
05| random |04 
06| random |03 
07| random |06 
08| random |05 
09| random |03 
------------------------ 

и Ид хотели показать таблицу, как это:

------------------------- 
sex|subsequent|first_time 
m |4   | 1 
f |2   | 2 
------------------------- 

до сих пор у меня есть это от моих данных:

------------------------- 
sex|subsequent|first_time 
m |16  | 1(wrong value) 
------------------------- 

Я получил выше результат этого запроса:

select 
    p.sex, 
    count(c.id_pacient) as subsquent, 
    count(distinct c.pacientes_id) as first_time 
from pacient p 
inner join consulting c on p.id=c.id_pacient 
group by c.id_pacient having subsequent > 1; 
+1

Все пациенты имеют первый визит. В противном случае они не были бы пациентами. Вы имеете в виду «только один визит»? – Bohemian

ответ

0

Используйте подзапрос, чтобы вычислить количество раз каждый пациент посетил, а затем использовать случай, чтобы суммировать различные столбцы:

select 
    sex, 
    sum(visits = 1) single_visit, 
    sum(visits > 1) subsequent 
from (select p.sex, count(*) as visits 
     from pacient p 
     join consulting c on p.id=c.id_pacient 
     group by c.id_pacient) x 

В MySQL вы можете использовать sum(condition) подсчитать, сколько раз это правда, потому что верно, то 1 и фальшь 0.


для того, чтобы оба пола представлены в выходных данных, используйте левое соединение до строк набор, содержащий значения, как секс:

select 
    s.sex, 
    sum(visits = 1) single_visit, 
    sum(visits > 1) subsequent 
from (select 'm' sex union select 'f') s 
left join (select p.sex, count(*) as visits 
     from pacient p 
     join consulting c on p.id=c.id_pacient 
     group by c.id_pacient) v 
    on v.sex = s.sex 
+0

Спасибо, сэр, вы подошли к окончательному результату, которого я действительно хочу, я только что отредактировал выше, чтобы вы могли видеть результат, полученный из вашего запроса. – Genesis

+0

@Genesis. Теперь вы задаете новый вопрос и отредактировали свой вопрос, чтобы обратиться к моему ответ, который дал бы вам образцы данных, которые вы предоставили. Вместо этого задайте новый вопрос о том, как обеспечить, чтобы все полы присутствовали на выходе, даже если для них нет строк для консультаций. Я вернул вам последние изменения. – Bohemian

+0

Мне очень жаль, новый вопрос в том, что, как я могу обеспечить, чтобы все гендерные группы могли присутствовать в выходе, я пробовал другое решение, но он не работал, вместо этого группируя их с помощью c.id_pacient, я сменил его на группы по полу и выходу был почти таким же, но в этом случае женщина была выходом вместо мужчины и имела 0 в столбце single_visit, который был прав на этом, но после этого выход был 2 таким же, как и мужской выход, так как я могу гарантировать, что конечный результат соответствует для каждого пола, т. е. у женщин должно быть 1, а мужчина должен был быть 1 также в последующей колонке. – Genesis