首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL如何计算每个日期的所有剩余数据

SQL如何计算每个日期的所有剩余数据
EN

Stack Overflow用户
提问于 2017-03-18 23:10:13
回答 1查看 58关注 0票数 0

我有以下SQL函数

代码语言:javascript
运行
复制
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

计算某产品在某日期、某部门、某部门的剩余量。

如果小于零,则表示数据库有问题

现在我需要找到每个卡的所有残留物,每个部门的所有日期在数据库中的结果是错误的。

从理论上讲,我们可以通过在如下查询中调用此过程来查找此过程

代码语言:javascript
运行
复制
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')

代码语言:javascript
运行
复制
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

您可以帮助重写此查询以查找所有日期的遗体吗?

EN

回答 1

Stack Overflow用户

发布于 2017-03-19 01:04:39

假设SQL Server为2008或更高版本:

要查找所有日期,只需注释掉日期过滤器,如下所示:

代码语言:javascript
运行
复制
-- AND (Operations.[Date] <= '2016-10-04') 

如果您需要过滤日期范围:

代码语言:javascript
运行
复制
AND (Operations.[Date] between between getDate()-30 and getDate()

将-30更改为过去的任意天数。所以一年前是-364。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42876031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档