2014-12-16 6 views
0

я пытаюсь соединить следующие две таблицы:Присоединяйтесь таблицы в результате только одну строку

 Table Patient     |  Table incident 
patient.id patient.birthdate   | incident.patientid  serviceid 
1     1/1/2000   |  1      8 
2     1/1/1990   |  1      8 
3     1/1/2005   |  2      10 
4     1/1/1980   |  3      11 
5     1/1/2000   |  3      11 
6     1/1/1990   |  3      11 
7     1/1/1980   |  6      23 
8     1/1/2000   |  7      8 

для того, чтобы возрастную Разделения всех пациентов, сгруппированных по их ServiceID.

SELECT serviceid, 
     SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25) BETWEEN 0 AND 15 THEN 1 ELSE 0 END) AS [Under 15], 
     SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25) BETWEEN 16 AND 18 THEN 1 ELSE 0 END) AS [16-18], 
     SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25) BETWEEN 19 AND 23 THEN 1 ELSE 0 END) AS [19-23], 
     SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25) BETWEEN 24 AND 30 THEN 1 ELSE 0 END) AS [24-30], 
     SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25) BETWEEN 31 AND 40 THEN 1 ELSE 0 END) AS [31-40], 
     SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25) BETWEEN 41 AND 50 THEN 1 ELSE 0 END) AS [41-50], 
     SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25) BETWEEN 51 AND 65 THEN 1 ELSE 0 END) AS [51-65], 
     SUM(CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25) > 65 THEN 1 ELSE 0 END) AS [>65] 

from patient 
inner join incident 
on patient.id = incident.patientConcerned 
group by serviceid 

Но что я пытаюсь выше, считается возраст всех пациентов для всех своих инцидентов, а это означает, что я не считая отдельных пациентов. (например, я рассчитываю пациента 1, дважды и пациента 3, три раза)

Так что я хочу присоединиться к этим двум таблицам, но только с одной строкой.

Как я могу это сделать?

+0

Почему вам нужно соединить таблицы? Просто знать, что у пациента есть один или несколько инцидентов? Если это так, переместите критерии в предложение WHERE (EXISTS ...). – jarlh

+0

Любой инцидент может это сделать. я не возражаю, все они имеют информацию, которую я хочу – Daggy

+0

, что вы используете? MySQL? оракул? – road242

ответ

0

Вместо sum() использование count(distinct). Вот пример:

SELECT serviceid, 
     COUNT(DISTINCT CASE WHEN FLOOR((CAST (GetDate() AS INTEGER) - CAST(patient.birthdate AS INTEGER)) /365.25) BETWEEN 0 AND 15 
          THEN Patient.Id 
         END) AS [Under 15], 
     . . . 
0

Distinct Оператор. Вы запрос должен быть как следующее:

SELECT Distinct a.id, a.birthdate ,b.patient from 
    patient a inner join incident b ON a.serviceid=b.serviceid 
+0

Я был бы признателен за помощь в этом вопросе. Потому что я присоединился к таблицам, как вы сказали, но у меня нет лучшего результата. Благодарю вас. – Daggy

0

Вместо group by serviceid использование group by patient.patient_id

Смежные вопросы