带有join和group by的SQL查询

时间:2015-10-10 06:58:51

标签: sql sql-server sql-server-2008

我在sql中有两个表。第一个是患者名单,第二个是他们的报告。所有患者的报告都在报告中,只有id我们可以加入他们。每位患者都有一些报告(也许记录的所有字段都没有填写)。现在我想做一份报告,得到每位患者的最后一份报告,但如果该病人的最后一份记录中有些字段是空的,我应填写该患者记录的最后填写记录。我在报告表中有约会。

我想为所有患者做这件事。在这里,我将为一位患者添加一张照片作为例子

enter image description here

在上面的示例中,我只想在报告中为该患者突出显示。

我已经编写了这个查询,但即使最后一条记录中的字段为空,而前一条记录中的数据也是如此。

SELECT patient.bartar_id,patient.bartar_enteringthesystem,patient.bartar_proviencename,
       patient.bartar_cityname,patient.bartar_coloplastrepname,patient.bartar_consultorname,
       patient.bartar_provienceofsurgeryname,patient.bartar_cityofsurgeryname,
       patient.bartar_surgeryhospitalname,patient.bartar_doctor,patient.bartar_patientstatusname,
       patient.bartar_ostomytypename, patient.bartar_ostomytimename,
       r.bartar_date,r.bartar_delay,r.bartar_nextcall,r.new_newcaller,  
       r.bartar_brandname,r.bartar_pastename,r.bartar_bagname,r.bartar_accname,
       r.bartar_pastepermonth,r.bartar_bagepermonth,r.bartar_insuranceinfo,
       patient.bartar_deathhealeddate,patient.bartar_dateofseurgery
FROM [Bartar_MSCRM].[dbo].[Filteredbartar_newpaitient] as patient 
JOIN (SELECT r.*, row_number() over (partition by r.bartar_patientname 
                                     order by r.bartar_date desc) as seqnum
      FROM [Bartar_MSCRM].[dbo].[Filteredbartar_callcenterreport] as r
      where r.bartar_delay is not null
     ) r
ON r.bartar_patientname = patient.bartar_newpaitientid and seqnum = 1 
ORDER BY patient.bartar_id DESC ;

患者表

enter image description here

报告表

enter image description here

加入

enter image description here

最终报告我想要什么

enter image description here

3 个答案:

答案 0 :(得分:1)

你的脚本看起来很好,所以我现在只是将它放在一个临时表上,并按顺序执行查询并按" OR"进行过滤。之后。

请尝试下面的脚本。

    SELECT patient.bartar_id,patient.bartar_enteringthesystem,patient.bartar_proviencename,
           patient.bartar_cityname,patient.bartar_coloplastrepname,patient.bartar_consultorname,
           patient.bartar_provienceofsurgeryname,patient.bartar_cityofsurgeryname,
           patient.bartar_surgeryhospitalname,patient.bartar_doctor,patient.bartar_patientstatusname,
           patient.bartar_ostomytypename, patient.bartar_ostomytimename,
           r.bartar_date,r.bartar_delay,r.bartar_nextcall,r.new_newcaller,  
           r.bartar_brandname,r.bartar_pastename,r.bartar_bagname,r.bartar_accname,
           r.bartar_pastepermonth,r.bartar_bagepermonth,r.bartar_insuranceinfo,
           patient.bartar_deathhealeddate,patient.bartar_dateofseurgery
, ROW_NUMBER() OVER (PARTITION BY r.bartar_newpaitientid, r.bartar_pastepermonth ORDER BY r.bartar_date DESC) AS bartarpaste_sequence
, ROW_NUMBER() OVER (PARTITION BY r.bartar_newpaitientid, r.bartar_acc ORDER BY r.bartar_date DESC) AS bartaracc_sequence
, ROW_NUMBER() OVER (PARTITION BY r.bartar_newpaitientid, r.bartar_insuranceinfo ORDER BY r.bartar_date DESC) AS bartarins_sequence
, ROW_NUMBER() OVER (PARTITION BY r.bartar_newpaitientid, r.bartar_brandname ORDER BY r.bartar_date DESC) AS bartarbrd_sequence
    INTO #tmpPatientReport
    FROM [Bartar_MSCRM].[dbo].[Filteredbartar_newpaitient] as patient 
    JOIN (SELECT r.*, row_number() over (partition by r.bartar_patientname 
                                         order by r.bartar_date desc) as seqnum
          FROM [Bartar_MSCRM].[dbo].[Filteredbartar_callcenterreport] as r
          where r.bartar_delay is not null
         ) r
    ON r.bartar_patientname = patient.bartar_newpaitientid and seqnum = 1 
    ORDER BY patient.bartar_id DESC;

    SELECT
       *
    FROM #tmpPatientReport
    WHERE 
       bartarpaste_sequence = 1
       OR bartaracc_sequence = 1
       OR bartarins_sequence = 1
       OR bartarbrd_sequence = 1

答案 1 :(得分:1)

这是一个样本, 在您的情况下,您必须获取子查询中的每个列的值(在join语句中或在主select语句中) 例如:

inner join (
        select distinct bartar_patientname
                ,(select top 1 bartar_pastePerMonth from [Bartar_MSCRM].[dbo].[Filteredbartar_callcenterreport] c2 where c2.bartar_patientname = cte.bartar_patientname and c2.bartar_pastePerMonth is not null order by c2.bartar_date desc) as bartar_date
                ,(select top 1 bartar_acc           from [Bartar_MSCRM].[dbo].[Filteredbartar_callcenterreport] c2 where c2.bartar_patientname = cte.bartar_patientname and c2.bartar_acc is not null order by c2.bartar_date desc) as bartar_acc
                ,(select top 1 bartar_insuranceinfo from [Bartar_MSCRM].[dbo].[Filteredbartar_callcenterreport] c2 where c2.bartar_patientname = cte.bartar_patientname and c2.bartar_insuranceinfo is not null order by c2.bartar_date desc) as bartar_insuranceinfo
                ,(select top 1 bartar_brand         from [Bartar_MSCRM].[dbo].[Filteredbartar_callcenterreport] c2 where c2.bartar_patientname = cte.bartar_patientname and c2.bartar_brand is not null order by c2.bartar_date desc) as bartar_brand
        from [Bartar_MSCRM].[dbo].[Filteredbartar_callcenterreport] cte
        ) r

同样,这是解决方案的一个示例。

答案 2 :(得分:0)

只为每列加入

JOIN (SELECT r.colx, row_number() over (partition by r.bartar_patientname 
                                     order by r.bartar_date desc) as seqnum
      FROM [Bartar_MSCRM].[dbo].[Filteredbartar_callcenterreport] as r
      where r.bartar_delay is not null and r.colx in not null
     ) rx
ON rx.bartar_patientname = patient.bartar_newpaitientid and seqnum = 1