Sql server 你的附加分数很准确,所以改为+1:)-Gareth谢谢你的帮助和解释。我不熟悉SQL函数,这当然有帮助!没问题。需要记住的一点是,正如在另一条评论中提到的,您最初使用的内联表值函数(TVF)将比多语句TVF(如公认的答案中所示)性能更好。这是因为内联TVF

Sql server 你的附加分数很准确,所以改为+1:)-Gareth谢谢你的帮助和解释。我不熟悉SQL函数,这当然有帮助!没问题。需要记住的一点是,正如在另一条评论中提到的,您最初使用的内联表值函数(TVF)将比多语句TVF(如公认的答案中所示)性能更好。这是因为内联TVF,sql-server,function,parameter-passing,Sql Server,Function,Parameter Passing,你的附加分数很准确,所以改为+1:)-Gareth谢谢你的帮助和解释。我不熟悉SQL函数,这当然有帮助!没问题。需要记住的一点是,正如在另一条评论中提到的,您最初使用的内联表值函数(TVF)将比多语句TVF(如公认的答案中所示)性能更好。这是因为内联TVF的行为更像一个视图,因为无论何时调用它,它的定义都会扩展到外部查询中,因此可以对其进行优化,虽然执行了多语句TVF,但从性能角度来看,如果它是内联表值函数而不是多语句表值函数,则效果会更好。只要在开始时将其改为case表达式而不是IF,就可以极


你的附加分数很准确,所以改为+1:)-Gareth谢谢你的帮助和解释。我不熟悉SQL函数,这当然有帮助!没问题。需要记住的一点是,正如在另一条评论中提到的,您最初使用的内联表值函数(TVF)将比多语句TVF(如公认的答案中所示)性能更好。这是因为内联TVF的行为更像一个视图,因为无论何时调用它,它的定义都会扩展到外部查询中,因此可以对其进行优化,虽然执行了多语句TVF,但从性能角度来看,如果它是内联表值函数而不是多语句表值函数,则效果会更好。只要在开始时将其改为case表达式而不是IF,就可以极大地提高性能。从性能角度来看,如果它是内联表值函数而不是多语句表值函数,则性能会更好。只要在开始时将其改为case表达式而不是IF,就可以极大地提高性能。
  CREATE FUNCTION CS_AwaredRCPs
     (   
     @currentDate DATE,
    @fiscalYear INT

    IF DATEPART(m,@currentDate) > 10
        SET @fiscalYear = DATEPART(yyyy,@currentDate)
    ELSE
        SET @fiscalYear = DATEPART(yyyy,@currentDate) - 1
    END 
     )
    RETURNS TABLE 
    AS
    RETURN 
    (
    SELECT      dbo.tbl_requirementManagement.postaward_specialist_id, 
            SUM(dbo.tbl_requirementManagement.actual_award_value) AS    AwardValue, 
            COUNT(dbo.tbl_requirementManagement.postaward_specialist_id) AS AwardCount
    FROM        dbo.tbl_requirementManagement RIGHT OUTER JOIN
            dbo.vw_ContractSpecialists ON   dbo.tbl_requirementManagement.postaward_specialist_id = dbo.vw_ContractSpecialists.user_certificateSerialNumber
    GROUP BY    dbo.tbl_requirementManagement.statusID, dbo.tbl_requirementManagement.postaward_specialist_id, dbo.tbl_requirementManagement.fiscal_year
    HAVING     (dbo.tbl_requirementManagement.statusID = 4) AND 
           (dbo.tbl_requirementManagement.postaward_specialist_id <> 0) AND 
           (dbo.tbl_requirementManagement.fiscal_year = @fiscalYear)

    )
CREATE FUNCTION Cs_awaredrcps (@currentDate DATE)
RETURNS @ret_table TABLE (
  postaward_specialist_id INT,
  AwardValue              INT,
  AwardCount              INT )
AS
  BEGIN
      DECLARE @fiscalYear INT

      IF Datepart(Month, @currentDate) > 10
        SET @fiscalYear = Datepart(yyyy, @currentDate)
      ELSE
        SET @fiscalYear = Datepart(yyyy, @currentDate) - 1

      INSERT INTO @ret_table
      SELECT dbo.tbl_requirementManagement.postaward_specialist_id,
             Sum(dbo.tbl_requirementManagement.actual_award_value)        AS AwardValue,
             Count(dbo.tbl_requirementManagement.postaward_specialist_id) AS AwardCount
      FROM   dbo.tbl_requirementManagement
             RIGHT OUTER JOIN dbo.vw_ContractSpecialists
                           ON dbo.tbl_requirementManagement.postaward_specialist_id = dbo.vw_ContractSpecialists.user_certificateSerialNumber
      GROUP  BY dbo.tbl_requirementManagement.statusID,
                dbo.tbl_requirementManagement.postaward_specialist_id,
                dbo.tbl_requirementManagement.fiscal_year
      HAVING ( dbo.tbl_requirementManagement.statusID = 4 )
             AND ( dbo.tbl_requirementManagement.postaward_specialist_id <> 0 )
             AND ( dbo.tbl_requirementManagement.fiscal_year = @fiscalYear )

      RETURN
  END 
fiscal_year = DATEPART(YEAR, @currentDate) 
                + CASE WHEN DATEPART(MONTH, @CurrentDate) <= 10 THEN -1 ELSE 0 END
CREATE FUNCTION CS_AwaredRCPs (@currentDate DATE)
RETURNS TABLE
AS
RETURN
(   SELECT  rm.postaward_specialist_id,
            SUM(rm.actual_award_value) AS AwardValue, 
            COUNT(rm.postaward_specialist_id) AS AwardCount
    FROM    dbo.tbl_requirementManagement AS rm
            INNER JOIN dbo.vw_ContractSpecialists AS cs
                ON rm.postaward_specialist_id = cs.user_certificateSerialNumber 
    WHERE   rm.fiscal_year = DATEPART(YEAR,@currentDate) 
                                + CASE WHEN DATEPART(MONTH, @CurrentDate) <= 10 THEN -1 ELSE 0 END
    AND     rm.statusID = 4
    AND     rm.postaward_specialist_id <> 0
    GROUP BY rm.statusID, rm.postaward_specialist_id, rm.fiscal_year
);