在rdlc报告中获得特定患者的总数

时间:2013-08-04 04:22:27

标签: asp.net sql-server

我已经做了一天的患者总数的rdlc报告,并且工作正常。我有女性男性患者的总数,但是当报告绑定时,它返回的总数等于我数据中的行数。
例如,如果我的报表中有20行,那么当我打印计数时,它会返回20行的计数。

如何让它只在一行?

这是我正在使用的查询:

SET ANSI_NULLS ON 
SET QUOTED_IDENTIFIER ON GO 

ALTER PROCEDURE [dbo].[Test_test_test]-- '2013/08/02' 
-- Add the parameters for the stored procedure here 
-- Add the parameters for the stored procedure here 
(@date VARCHAR(20)) 
AS 
  BEGIN 
      SET NOCOUNT ON; 
      SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

      SELECT ( CASE 
                 WHEN OLD_NEW_PATIENT.OLD_NEW = 'new' THEN 
                 PATIENT_REF_MASTER.PAT_ID 
                 ELSE NULL 
               END )                                                 AS 'new', 
             ( CASE 
                 WHEN OLD_NEW_PATIENT.OLD_NEW = 'old' THEN 
                 PATIENT_REF_MASTER.PAT_ID 
                 ELSE NULL 
               END )                                                 AS 'old', 
             ---------------------------------------- 
             ( CASE 
                 WHEN GENDER_MASTER.NAME1 = 'Female' THEN GENDER_MASTER.NAME1 
                 ELSE NULL 
               END )                                                 AS 
             'Females', 
             ( CASE 
                 WHEN GENDER_MASTER.NAME1 = 'Male' THEN GENDER_MASTER.NAME1 
                 ELSE NULL 
               END )                                                 AS 'Males', 
             ------------------------------------- 
             CONVERT(VARCHAR, PATIENT_REF_MASTER.CREATION_DATE, 105) AS 
             'creation_Date', 
             PATIENT_REF_MASTER.SR_NO                                AS 'sr_No', 
             PATIENT_MASTER.PAT_FNAME + ' ' 
             + PATIENT_MASTER.PAT_SNAME                              AS 'NAME', 
             DEPT_ID                                                 AS 
             'Dept_ID', 
             DEPT_MASTER.DEPT_NAME                                   AS 
             'Dept_Name', 
             DOC_MASTER.DOC_ID                                       AS 
             'Doc_Master', 
             DOC_MASTER.DOC_FNAME + ' ' 
             + DOC_MASTER.DOC_SNAME                                  AS 
             'Doc_Name' 
             , 
             PATIENT_MASTER.PAT_ADDR 
             AS 'addr', 
             GENDER_MASTER.NAME1                                     AS 
             'Pat_Sex', 
             PATIENT_MASTER.AGE                                      AS 'age', 
             (SELECT Count(PATIENT_REF_MASTER.SR_NO) 
              FROM   PATIENT_REF_MASTER 
              WHERE  PATIENT_REF_MASTER.CREATION_DATE = @date)       AS 'count', 
             (SELECT Count(PATIENT_MASTER.PAT_SEX) 
              FROM   PATIENT_MASTER 
                     LEFT JOIN PATIENT_REF_MASTER 
                            ON PATIENT_REF_MASTER.PAT_ID = 
                               PATIENT_MASTER.PAT_CODE 
              WHERE  PATIENT_REF_MASTER.CREATION_DATE = @date 
                     AND PATIENT_MASTER.PAT_SEX = 2)                 AS 
             'F_count', 
             (SELECT Count(PATIENT_MASTER.PAT_SEX) 
              FROM   PATIENT_MASTER 
                     LEFT JOIN PATIENT_REF_MASTER 
                            ON PATIENT_REF_MASTER.PAT_ID = 
                               PATIENT_MASTER.PAT_CODE 
              WHERE  PATIENT_REF_MASTER.CREATION_DATE = @date 
                     AND PATIENT_MASTER.PAT_SEX = 1)                 AS 
             'M_count' 
      FROM   PATIENT_REF_MASTER 
             LEFT JOIN DBO.OLD_NEW_PATIENT 
                    ON DBO.OLD_NEW_PATIENT.CODE = PATIENT_REF_MASTER.OLD_NEW 
             LEFT JOIN DBO.DEPT_MASTER 
                    ON DEPT_MASTER.DEPT_CODE = PATIENT_REF_MASTER.DEPT_ID 
             LEFT JOIN PATIENT_MASTER 
                    ON PATIENT_MASTER.PAT_CODE = PATIENT_REF_MASTER.PAT_ID 
             LEFT JOIN DOC_MASTER 
                    ON DOC_MASTER.DOC_ID = PATIENT_REF_MASTER.DOC_ID 
             LEFT JOIN GENDER_MASTER 
                    ON GENDER_MASTER.CODE = PATIENT_MASTER.PAT_SEX 
      WHERE  PATIENT_REF_MASTER.CREATION_DATE = @date 
      --MONTH(Patient_Ref_master.creation_Date)=@month and Dept_ID=@dept 
      ORDER  BY PATIENT_REF_MASTER.SR_NO ASC 
  --  select Dept_Master.Dept_Name as 'Dept_Name', 
  --  count(Pat_ID) as 'Pat_ID' 
  -- 
  -- from Patient_Ref_master 
  --left join dbo.Dept_Master  on   Dept_Master.Dept_code  =   Patient_Ref_master.Dept_ID 
  --where MONTH(Patient_Ref_master.creation_Date)=@month and Dept_ID=@dept 
  --group by Dept_Master.Dept_Name 
  END 

1 个答案:

答案 0 :(得分:1)

我认为你一次尝试做很多事情; - )

问题的核心在于:

SELECT Count(PATIENT_MASTER.PAT_SEX) 
              FROM   PATIENT_MASTER 
                     LEFT JOIN PATIENT_REF_MASTER 
                            ON PATIENT_REF_MASTER.PAT_ID = 
                               PATIENT_MASTER.PAT_CODE 
              WHERE  PATIENT_REF_MASTER.CREATION_DATE = @date 
                     AND PATIENT_MASTER.PAT_SEX = 1

通过在查询中使用此查询,它将返回每行中的总计。这也是您可以编写查询而不使用GROUP BY子句的原因 我建议您在此查询中执行所有工作,但计数除外,然后在此计数之外使用另一个查询进行计数。

第二个问题是,在您的查询中,您正在请求有关每一行的若干详细信息,但您希望它返回到一行。你必须决定你想要什么;)。

为了获得一行中的计数,请尝试以下方法:

SET ANSI_NULLS ON 
SET QUOTED_IDENTIFIER ON GO 

ALTER PROCEDURE [dbo].[Test_test_test]-- '2013/08/02' 
-- Add the parameters for the stored procedure here 
-- Add the parameters for the stored procedure here 
(@date VARCHAR(20)) 
AS 
  BEGIN 
      SET NOCOUNT ON; 
      SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 

      SELECT Count(*) count, 
             Sum(CASE 
                   WHEN FEMALES IS NOT NULL THEN 1 
                   ELSE 0 
                 END) F_Count, 
             Sum(CASE 
                   WHEN MALES IS NOT NULL THEN 1 
                   ELSE 0 
                 END) M_Count 
      FROM   (SELECT ( CASE 
                         WHEN OLD_NEW_PATIENT.OLD_NEW = 'new' THEN 
                         PATIENT_REF_MASTER.PAT_ID 
                         ELSE NULL 
                       END )                                                 AS 
                     'new', 
                     ( CASE 
                         WHEN OLD_NEW_PATIENT.OLD_NEW = 'old' THEN 
                         PATIENT_REF_MASTER.PAT_ID 
                         ELSE NULL 
                       END )                                                 AS 
                     'old', 
                     ---------------------------------------- 
                     ( CASE 
                         WHEN GENDER_MASTER.NAME1 = 'Female' THEN 
                         GENDER_MASTER.NAME1 
                         ELSE NULL 
                       END )                                                 AS 
                     'Females', 
                     ( CASE 
                         WHEN GENDER_MASTER.NAME1 = 'Male' THEN 
                         GENDER_MASTER.NAME1 
                         ELSE NULL 
                       END )                                                 AS 
                     'Males', 
                     ------------------------------------- 
                     CONVERT(VARCHAR, PATIENT_REF_MASTER.CREATION_DATE, 105) AS 
                            'creation_Date', 
                     PATIENT_REF_MASTER.SR_NO                                AS 
                     'sr_No', 
                     PATIENT_MASTER.PAT_FNAME + ' ' 
                     + PATIENT_MASTER.PAT_SNAME                              AS 
                     'NAME' 
                     , 
                     DEPT_ID 
                     AS 'Dept_ID', 
                     DEPT_MASTER.DEPT_NAME                                   AS 
                     'Dept_Name', 
                     DOC_MASTER.DOC_ID                                       AS 
                     'Doc_Master', 
                     DOC_MASTER.DOC_FNAME + ' ' 
                     + DOC_MASTER.DOC_SNAME                                  AS 
                     'Doc_Name', 
                     PATIENT_MASTER.PAT_ADDR                                 AS 
                     'addr' 
                     , 
                     GENDER_MASTER.NAME1 
                     AS 'Pat_Sex', 
                     PATIENT_MASTER.AGE                                      AS 
                     'age' 
              FROM   PATIENT_REF_MASTER 
                     LEFT JOIN DBO.OLD_NEW_PATIENT 
                            ON DBO.OLD_NEW_PATIENT.CODE = 
                               PATIENT_REF_MASTER.OLD_NEW 
                     LEFT JOIN DBO.DEPT_MASTER 
                            ON DEPT_MASTER.DEPT_CODE = 
                               PATIENT_REF_MASTER.DEPT_ID 
                     LEFT JOIN PATIENT_MASTER 
                            ON PATIENT_MASTER.PAT_CODE = 
                               PATIENT_REF_MASTER.PAT_ID 
                     LEFT JOIN DOC_MASTER 
                            ON DOC_MASTER.DOC_ID = PATIENT_REF_MASTER.DOC_ID 
                     LEFT JOIN GENDER_MASTER 
                            ON GENDER_MASTER.CODE = PATIENT_MASTER.PAT_SEX 
              WHERE  PATIENT_REF_MASTER.CREATION_DATE = @date 
             --MONTH(Patient_Ref_master.creation_Date)=@month and Dept_ID=@dept 
             )T 
      ORDER  BY PATIENT_REF_MASTER.SR_NO ASC 
  END 

我希望这会有所帮助,如果您需要更多信息,请与我们联系。

修改

在我发布的查询中发现一个小错误,字段名称应该是FEMALES而不是FEMALEMALES不是MALE

我还在SQL Fiddle中设置了缩小的示例。看一看并告诉我你的想法。