2013-08-05 7 views
1

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

SELECT DISTINCT 
     Patient_Ref_master.Dept_ID AS 'Dept_ID' , 
     (SELECT DISTINCT 
        COUNT(Patient_Ref_master.Sr_No) 
      FROM  Patient_Ref_master 
        LEFT JOIN Patient_Master ON Patient_Master.Pat_Code = Patient_Ref_master.Pat_ID 
      WHERE  Patient_Ref_master.creation_Date = '2013/08/02' 
        AND Patient_Master.Age >= 0 
        AND Patient_Master.Age <= 16 
        AND Patient_Master.Pat_Sex = 1 
     ) AS 'Boys' , 
     (SELECT DISTINCT 
        COUNT(Patient_Ref_master.Sr_No) 
      FROM  Patient_Ref_master 
        LEFT JOIN Patient_Master ON Patient_Master.Pat_Code = Patient_Ref_master.Pat_ID 
      WHERE  Patient_Ref_master.creation_Date = '2013/08/02' 
        AND Patient_Master.Age >= 0 
        AND Patient_Master.Age <= 16 
        AND Patient_Master.Pat_Sex = 2 
     ) AS 'Girls' , 
     (SELECT DISTINCT 
        COUNT(Patient_Ref_master.Sr_No) 
      FROM  Patient_Ref_master 
        LEFT JOIN Patient_Master ON Patient_Master.Pat_Code = Patient_Ref_master.Pat_ID 
      WHERE  Patient_Ref_master.creation_Date = '2013/08/02' 
        AND Patient_Master.Age > 16 
        AND Patient_Master.Pat_Sex = 2 
     ) AS 'Females' , 
     (SELECT DISTINCT 
        COUNT(Patient_Ref_master.Sr_No) 
      FROM  Patient_Ref_master 
        LEFT JOIN Patient_Master ON Patient_Master.Pat_Code = Patient_Ref_master.Pat_ID 
      WHERE  Patient_Ref_master.creation_Date = '2013/08/02' 
        AND Patient_Master.Age > 16 
        AND Patient_Master.Pat_Sex = 1 
     ) AS 'Males' 
FROM Patient_Ref_master 
     LEFT JOIN Patient_Master ON Patient_Master.Pat_Code = Patient_Ref_master.Pat_ID 
     LEFT JOIN Gender_master ON Gender_master.Code = Patient_Master.Pat_Sex 
     LEFT JOIN Dept_Master ON Dept_Master.Dept_code = Patient_Ref_master.Dept_ID 
WHERE Patient_Ref_master.creation_Date = '2013/08/02' 
GROUP BY Patient_Master.Pat_Sex , 
     Patient_Ref_master.Dept_ID 

Здесь я пытаюсь достичь подсчета мальчиков, девочек, мужчин и женщин в соответствии с departmet мудр, который выбран в качестве первого столбца. Но я получаю результат как

Dept_ID Boys Girls Females Males 
102  3  0  11  6 
103  3  0  11  6 
104  3  0  11  6 

Общее количество пациентов - 20, которое отражается в каждом ряду. Как я могу достичь идеального подсчета мальчиков, девочек, мужчин и женщин по отделам

Patient_ref_master

Sr_No int 
Receipt_no varchar(50) 
old_new int 
Pat_catagory int 
Fees decimal(10, 2) 
Pat_ID int 
Doc_ID int 
Dept_ID int 
Age_Catagory int 
Age decimal(10, 7) 
creation_Date datetime 
created_By int 
Qty decimal(5, 2) 
Actual_Amnt decimal(7, 4) 
Receipt_type int 
Receipt_total_Price decimal(7, 4) 
Receipt_suggestion_Type int 
Receipt_actual_suggestion int 

мастер Пациент

Pat_Code int 
Pat_FName varchar(30) 
Pat_MName varchar(30) 
Pat_SName varchar(30) 
Pat_Sex varchar(10) 
Pat_Addr varchar(100) 
Pat_Mob_No varchar(13) 
age int 
creation_Date datetime 
created_By int 
+0

Опишите таблицы Patient_Ref_master и Patient_Master. Ответ будет серией записей CASE, но их будет сложно написать, не зная структуры таблиц. –

+0

, как указано в комментарии выше, без определения таблиц, мы не можем определить проблему. также включите дамп содержимого таблицы x (20 строк). Очевидно, что одна из ваших строк выходит за пределы критериев выбора запроса. – DwB

+0

см. Мои правки, я предоставлю схему таблицы. – Ankur

ответ

2

Хотя я не уверен, без выборки данных, но дать а именно:

;with cte as (
    SELECT prm.Dept_ID, p.[Group], prm.Sr_No 
    FROM Patient_Ref_master prm 
     JOIN Patient_Master pm ON pm.Pat_Code = prm.Pat_ID 
     CROSS APPLY (
      select 
       case 
        when pm.Age between 0 and 16 and pm.Pat_Sex = 1 then 'Boys' 
        when pm.Age between 0 and 16 and pm.Pat_Sex = 2 then 'Girls' 
        when pm.Age > 16 and pm.Pat_Sex = 2 then 'Females' 
        when pm.Age > 16 and pm.Pat_Sex = 1 then 'Males' 
       end as [Group] 
     ) p 
    WHERE prm.creation_Date = '2013/08/02' 
) 
select Dept_ID, [Boys], [Girls], [Females], [Males] 
from cte 
    pivot (count(Sr_No) for [Group] in ([Boys],[Girls],[Females],[Males])) p 

Я удалил left join до Gender_master и Dept_Master, так как я не вижу их использования. Также я изменил соединение с left на внутренний между Patient_Ref_master и Patient_Master.