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
);