使用 CASE 语句每月获取过去 4 年的数据 COUNT

Get the COUNT of data for last 4 years monthly by using CASE statement

我试过这个:

SELECT DISTINCT 
    MONTH(ENCOUNTER_DATE) 'MONTH',
    COUNT(CASE WHEN ENCOUNTER_DATE >= DATEADD(YEAR, -1, GETDATE()) THEN CUSTOMER_ID END)  ,
    COUNT(CASE WHEN ENCOUNTER_DATE >= DATEADD(YEAR, -2, GETDATE()) THEN CUSTOMER_ID END),
    COUNT(CASE WHEN ENCOUNTER_DATE >= DATEADD(YEAR, -3, GETDATE()) THEN CUSTOMER_ID END),
    COUNT(CASE WHEN ENCOUNTER_DATE >= DATEADD(YEAR, -4, GETDATE()) THEN CUSTOMER_ID END)
FROM 
    PATIENT_ENCOUNTERS
GROUP BY 
    MONTH(ENCOUNTER_DATE)
ORDER BY 
    MONTH(ENCOUNTER_DATE)

每个月的数据计数正在添加到下一年的同月。

我交叉检查了以下数据不匹配的查询

SELECT 
    YEAR(ENCOUNTER_DATE), COUNT(CUSTOMER_ID) 
FROM 
    PATIENT_ENCOUNTERS
WHERE 
    ENCOUNTER_DATE >= DATEADD(YEAR, -4, GETDATE())
GROUP BY 
    YEAR(ENCOUNTER_DATE)
ORDER BY 
    YEAR(ENCOUNTER_DATE) DESC

有人可以仅使用 case 语句帮助我查找过去 4 年的每月数据吗?

您的问题是您设置的是开始日期而不是结束日期。尝试类似于以下内容。

COUNT(CASE WHEN ENCOUNTER_DATE >= DATEADD(YEAR, -4, GETDATE()) AND ENCOUNTER_DATE < DATEADD(YEAR, -3, GETDATE()) THEN CUSTOMER_ID END)

试试这个:

SELECT DISTINCT MONTH(ENCOUNTER_DATE) 'MONTH',
COUNT(CASE WHEN year(ENCOUNTER_DATE) = YEAR(GETDATE()) THEN CUSTOMER_ID END)  ,
COUNT(CASE WHEN year(ENCOUNTER_DATE)= YEAR(GETDATE())-1 THEN CUSTOMER_ID END),
COUNT(CASE WHEN year(ENCOUNTER_DATE)= YEAR(GETDATE())-2 THEN CUSTOMER_ID END),
COUNT(CASE WHEN year(ENCOUNTER_DATE)= YEAR(GETDATE())-3 THEN CUSTOMER_ID END)
FROM PATIENT_ENCOUNTERS
GROUP BY MONTH(ENCOUNTER_DATE)
ORDER BY MONTH(ENCOUNTER_DATE)

在这里 YEAR(GETDATE()) 我得到了当年的年份,YEAR(GETDATE())-1 得到了去年的年份部分,依此类推。然后我将今年与 encounter_date 年作为 year(encounter_date) = YEAR(GETDATE()) 进行了比较,以获得那年的 customer_id ,它们按月分组。

获取年度累计计数:

SELECT DISTINCT MONTH(ENCOUNTER_DATE) 'MONTH',
    COUNT(CASE WHEN year(ENCOUNTER_DATE) = YEAR(GETDATE()) THEN CUSTOMER_ID END)  ,
    COUNT(CASE WHEN year(ENCOUNTER_DATE)>= YEAR(GETDATE())-1 THEN CUSTOMER_ID END),
    COUNT(CASE WHEN year(ENCOUNTER_DATE)>= YEAR(GETDATE())-2 THEN CUSTOMER_ID END),
    COUNT(CASE WHEN year(ENCOUNTER_DATE)>= YEAR(GETDATE())-3 THEN CUSTOMER_ID END)
    FROM PATIENT_ENCOUNTERS
    GROUP BY MONTH(ENCOUNTER_DATE)
    ORDER BY MONTH(ENCOUNTER_DATE)