【问题标题】:Getting a count for the first six months and last six months of FYear计算财政年度的前六个月和后六个月
【发布时间】:2016-07-26 13:36:35
【问题描述】:

我需要计算在当年前六个月和本财政年度最后六个月接受过服务的所有患者。这是我想出的,但不确定它是否会完全干净。

with sd as
 (
select  cln.cln_urn, MAX(srv_date) As Last_D, MIN(srv_date) AS First_d
    from cw_domain dmn
     inner join cw_service srv on srv.srv_dmn_fk=dmn.dmn_pk
     inner join cw_client cln on cln.cln_pk=srv.srv_cln_fk
     inner join cw_subservice sbs on sbs.sbs_pk=srv.srv_sbs_fk
     inner join cw_service_category ct on ct.srv_ct_rpk=sbs.sbs_srv_ct_rfk
WHERE srv.srv_date >= '03/01/2015'
      and srv.srv_date <= '02/29/2016'
      and srv_ct_rpk = '002'
      group by cln_urn
      having MAX(srv_date)>= MIN(srv_date)+180

      )  

select count (distinct cln_urn)
from sd

本报告研究的是跟上治疗进度的客户数量。为了让我们的客户群被视为“护理中”,他们必须每年看医生两次:上半年一次,下半年一次

【问题讨论】:

  • - 告诉我们您要选择的日期 - 今年的前 6 个月是什么意思,如果您说财政年度的最后 6 个月 - 非常令人困惑,您可能需要从中选择记录上半年,然后 INNER JOIN 从下半年开始记录 - 如果两者都存在 - 然后选择行
  • 看看年份。这些日期介于 2015 年 3 月 1 日和 2016 年 2 月 29 日之间。FY 年可以是 FY 或 CY。我在做风云。患者需要在指定年份的前六个月和指定年份的最后六个月都进行过访问才有资格。
  • 0 反对票是的,我知道,对不起,我错了 - 你可以从前半部分中选择,然后使用 IF EXISTS(select ..from 后半部分为同一个人) 完成选择

标签: sql sql-server tsql


【解决方案1】:

如果你想统计每个客户端有多少服务,你需要使用count函数。

select HalfOfYear
     , NumOfPatients = count(Client)
from (select  
         cln_urn as Client
        ,case when datepart(q,srv_date) in (1,2) then 'FirstHalf'   
              when datepart(q,srv_date) in (3,4) then 'SecondHalf'  
              end as HalfOfYear
     from cw_domain dmn
     inner join cw_service srv on srv.srv_dmn_fk=dmn.dmn_pk
     inner join cw_client cln on cln.cln_pk=srv.srv_cln_fk
     inner join cw_subservice sbs on sbs.sbs_pk=srv.srv_sbs_fk
     inner join cw_service_category ct on ct.srv_ct_rpk=sbs.sbs_srv_ct_rfk
     where srv.srv_date >= '03/01/2015'
      and srv.srv_date <= '02/29/2016'
      and srv_ct_rpk = '002'

      ) as x
group by HalfOfYear

【讨论】:

  • datepart 仅基于日历年而不是财政年度返回季度
  • 我同意,但是谁可以将 datepart 更改为另一个条件,例如 ... 和 ... 之间的 srv_date,然后前半部分继续...
  • 关闭。我需要的是在上半年和下半年访问过的所有客户的计数。不是上半场和下半场的数字。不过,我会进一步研究。
  • 本报告研究的是跟上治疗进度的客户数量。为了让我们的客户群被视为“护理中”,他们必须每年看医生两次:上半年一次,下半年一次。
  • 现在我明白你的需要 :) 我的查询可以呈现你想要的,当我们通过添加内部联接来修改子选择并在 where 子句中更改一点日期条件时
【解决方案2】:

这应该可以解决问题。只需将 @from 和 @thru 替换为您的日期即可。

WITH sd AS
(
    SELECT
        DISTINCT
        cln.cln_urn, 
        CASE
            WHEN srv.srv_date < DATEADD(MONTH, 6, @from) THEN 1
            WHEN srv.srv_date >= DATEADD(MONTH, 6, @from) THEN 2
            END AS 'half'
    FROM
        cw_domain dmn
        INNER JOIN cw_service AS srv 
            ON srv.srv_dmn_fk = dmn.dmn_pk
        INNER JOIN cw_client cln 
            ON cln.cln_pk = srv.srv_cln_fk
        INNER JOIN cw_subservice sbs 
            ON sbs.sbs_pk = srv.srv_sbs_fk
        INNER JOIN cw_service_category ct 
            ON ct.srv_ct_rpk = sbs.sbs_srv_ct_rfk
    WHERE 
        srv.srv_date >= @from
        AND srv.srv_date <= @thru
        AND srv_ct_rpk = '002'
)

SELECT
    COUNT(cln.cln_urn)
FROM
    sd AS fh
    JOIN sd AS sh
        ON fh.cln_urn = sh.cln_urn
WHERE
    fh.half = 1
    AND sh.half = 2

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多