我有以下SQL函数
CREATE FUNCTION [dbo].[GetCardDepartRemains]
(
@CardId INT,
@DepartId INT,
@Date DATETIME = NULL,
@DocumentId INT = NULL
)
RETURNS INT
AS
BEGIN
DECLARE @Res INT
SELECT
@Res = ISNULL(SUM(CASE WHEN Operations.[Output] = 0 AND Operations.RecipientId = @DepartId THEN 1 ELSE -1 END), 0)
FROM dbo.Operations
WHERE Operations.CardId = @CardId
AND (Operations.[Output] = 0 AND Operations.RecipientId = @DepartId OR Operations.Input = 0 AND Operations.SenderId = @DepartId)
AND (@Date IS NULL OR Operations.[Date] <= @Date)
RETURN @Res
END
GO计算某产品在某日期、某部门、某部门的剩余量。
如果小于零,则表示数据库有问题
现在我需要找到每个卡的所有残留物,每个部门的所有日期在数据库中的结果是错误的。
从理论上讲,我们可以通过在如下查询中调用此过程来查找此过程
SELECT DISTINCT Operations.[Date] as [Date],
Departments.Id as Depart,
Cards.Id as [Card],
[dbo].[GetCardDepartRemains] (Cards.Id, Departments.Id,Operations.[Date],NULL) as Res
FROM [jewellery].[dbo].[Cards]
CROSS JOIN [jewellery].[dbo].[Departments]
CROSS JOIN [jewellery].[dbo].[Operations]
WHERE [dbo].[GetCardDepartRemains] (Cards.Id, Departments.Id,Operations.[Date],NULL) = -1 但是这个查询的执行时间超过2分钟,所以我们需要编写一个新的查询。
我的查询可以找到每个部门每个部门在特定日期(例如,'2016-10-04')
SELECT
[Card],
Depart,
Res
FROM
(SELECT
Cards.Id as [Card],
Departments.Id as Depart,
ISNULL(SUM(CASE WHEN Operations.[Output] = 0 AND Operations.RecipientId = Departments.Id THEN 1 ELSE -1 END), 0) as Res
FROM Operations
CROSS JOIN Cards
CROSS JOIN Departments
WHERE Operations.CardId = Cards.Id
AND (Operations.[Output] = 0 AND Operations.RecipientId = Departments.Id OR Operations.Input = 0 AND Operations.SenderId = Departments.Id)
AND (Operations.[Date] <= '2016-10-04')
GROUP BY Cards.Id, Departments.Id
) as X
WHERE Res = -1您可以帮助重写此查询以查找所有日期的遗体吗?
发布于 2017-03-19 01:04:39
假设SQL Server为2008或更高版本:
要查找所有日期,只需注释掉日期过滤器,如下所示:
-- AND (Operations.[Date] <= '2016-10-04') 如果您需要过滤日期范围:
AND (Operations.[Date] between between getDate()-30 and getDate()将-30更改为过去的任意天数。所以一年前是-364。
https://stackoverflow.com/questions/42876031
复制相似问题