【问题标题】:How do I select data from previous years in SQL?如何在 SQL 中选择前几年的数据?
【发布时间】:2022-01-19 21:20:09
【问题描述】:

我尝试使用WHERE (YEAR(InceptionDate), -3, GETDATE()),但是

SELECT 
    CompanyName, ServiceSubCodeName, subdiagnosisName,
    YEAR(InceptionDate), 
    SUM(AmountCharged) AmountCharged,
    SUM(AmountAllowed) AmountAllowed, 
    SUM(AmountDenied) AmountDenied,  
    SUM(AmountDenied) * 100.0 / SUM(AmountCharged) AS DeniedPart
FROM 
    Fact.ClaimDetailVw
WHERE 
    (YEAR(InceptionDate), -5, GETDATE())
    -- WHERE YEAR(InceptionDate) = 2019 AND   
    AND VetCompanyName <> 'Unknown' 
GROUP BY
    CompanyName, ServiceSubCodeName, subdiagnosisName, 
    YEAR(InceptionDate)
HAVING 
    SUM(AmountCharged) <> 0
ORDER BY 
    CompanyName

但我得到一个错误

在预期条件的上下文中指定的非布尔类型的表达式,靠近 ','

这不是数据问题,因此不提供数据集。如您所见,它在注释代码中有效,但仅适用于 2019 年。我想要最近 5 年的数据

【问题讨论】:

  • Year(InceptionDate) &lt; year(getdate()) 哪里?

标签: sql-server tsql ssms


【解决方案1】:

如果您想要过去 5 年(包括今年)……

WHERE YEAR(InceptionDate) BETWEEN YEAR(GETDATE()) - 4 AND YEAR(GETDATE())

…如果你想要前 5 年不包括当前年份…

WHERE YEAR(InceptionDate) BETWEEN YEAR(GETDATE()) - 5 AND YEAR(GETDATE()) - 1

...这是一种安全的方法,因为它考虑到了未来数据(即预算/预测数据)的潜力。

【讨论】:

  • 在 VetCompanyName 附近出现不正确的语法错误
【解决方案2】:

首先获取你想要的年份作为开始日期

--get start year
    
declare @StartYear  int = year(getdate()) - 5;
    
select @StartYear
    
SELECT
    CompanyName,
    ServiceSubCodeName,
    subdiagnosisName,
    YEAR(InceptionDate), 
    SUM(AmountCharged) AmountCharged,
    SUM(AmountAllowed) AmountAllowed , 
    SUM(AmountDenied) AmountDenied , 
    SUM(AmountDenied)*100.0/SUM(AmountCharged) ASDeniedPert
FROM Fact.ClaimDetailVw
WHERE YEAR(InceptionDate) > @StartYear  
AND VetCompanyName <> 'Unknown' 
GROUP BY  CompanyName,ServiceSubCodeName,subdiagnosisName, YEAR(InceptionDate)
HAVING SUM(AmountCharged) <> 0
ORDER BY CompanyName

【讨论】:

    【解决方案3】:

    您最好计算 5 年前的第一天,然后查询该日期/时间值。

    SELECT 
        CompanyName, ServiceSubCodeName, subdiagnosisName,
        YEAR(InceptionDate), 
        SUM(AmountCharged) AmountCharged,
        SUM(AmountAllowed) AmountAllowed, 
        SUM(AmountDenied) AmountDenied,  
        SUM(AmountDenied) * 100.0 / SUM(AmountCharged) AS DeniedPart
    FROM 
        Fact.ClaimDetailVw
    WHERE 
        InceptionDate >= DATETIMEFROMPARTS(YEAR(GETDATE()) - 4, 1, 1, 0, 0, 0, 0)
        AND VetCompanyName <> 'Unknown' 
    GROUP BY
        CompanyName, ServiceSubCodeName, subdiagnosisName, 
        YEAR(InceptionDate)
    HAVING 
        SUM(AmountCharged) <> 0
    ORDER BY 
        CompanyName
    

    如果你想排除今年 - 你可以添加

        AND InceptionDate < DATETIMEFROMPARTS(YEAR(GETDATE()), 1, 1, 0, 0, 0, 0)
    

    如果将 InceptionDate 列定义为日期数据类型 - 那么您可以使用 DATEFROMPARTS(YEAR(GETDATE()) - 4, 1, 1)。

    【讨论】:

    • 这是正确答案,它使用了 SARGE-able WHERE 子句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 2015-09-28
    • 2021-05-22
    • 2018-06-07
    相关资源
    最近更新 更多