首页 > 解决方案 > 根据日期查找特定产品代码的下一个非空值

问题描述

我正在尝试一段时间来创建一个查询,该查询将在给定日期范围内的每个日期给出特定项目的库存值。

表格保持原样(NAVISION),我们不能影响结构,所以我们必须使用我们所拥有的。

结果基于查询包含日期、项目和项目分类帐条目的 3 个不同表(其中保留所有与项目相关的移动 IN、OUT、转入、转出......),所有这些移动的总和给出当前库存等级

以下查询的结果部分正常,但问题是当日没有变化时,产品的行为 NULL。

我们需要的是让查询转到特定产品的 Stock 的第一个下一个值,并显示该值而不是 NULL。因此,它应该首先找到下一个非 NULL 值,而不是让 Stock NULL 显示这个值

正如我们现在所拥有的那样,查询是:

SELECT 
    ROW_NUMBER() OVER (PARTITION BY [Date] ORDER BY i.[No_] ASC) as BarcodeInDate#
    ,CAST([Date] as date) as [Date]
    ,i.No_ as Barcode
    ,CAST(q.Stock as int) as Stock
    FROM [XLS].[dbo].[XLS$XLS Calendar] C
    CROSS JOIN XLS$Item i
    LEFT JOIN 
  (
        SELECT
        DISTINCT [Posting Date]
        ,[Item No_]
        ,SUM([Invoiced Quantity]) OVER (PARTITION BY [Item No_] ORDER BY [Posting Date]) Stock
        FROM
        [dbo].[XLS$Item Ledger Entry]
    ) q 
    on C.Date=q.[Posting Date] and i.No_=q.[Item No_]
where
C.[Date] between getdate()-31 and getdate()-1
ORDER BY C.Date DESC

我不知道如何在这里以最佳方式表示输出,所以下面是一张图片。

结果输出

**更新

正如@SteveC 推荐的...3 使用的表在下面创建语句,以便您可以查看查询表的数据和结构。

项目分类帐分录表

要在这里发布...链接以在我的驱动器上创建查询

https://drive.google.com/file/d/1xCq0_lh0S0gq7rx1VMC0ZHK4buu_rkit/view?usp=sharing

日历,它只是一个基本的单列日历,以便在查询中包含所有日期,即使项目移动没有变化。使用这个或一些动态的......它只是给定范围内的所有日期(例如过去 30 天)

CREATE TABLE [XLS$XLS Calendar](
   Date DATE  NOT NULL PRIMARY KEY
);
INSERT INTO XLS$Item(Date) VALUES ('14-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('15-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('16-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('17-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('18-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('19-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('20-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('21-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('22-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('23-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('24-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('25-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('26-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('27-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('28-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('29-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('30-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('31-07-2021');
INSERT INTO XLS$Item(Date) VALUES ('01-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('02-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('03-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('04-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('05-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('06-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('07-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('08-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('09-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('10-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('11-08-2021');
INSERT INTO XLS$Item(Date) VALUES ('12-08-2021');

项目简化,因为大多数数据对于这个查询并不重要......它只是项目描述和代码,重量等......

CREATE TABLE XLS$Item(
   No_                INTEGER  NOT NULL PRIMARY KEY 
  ,Description        VARCHAR(30) NOT NULL
  ,Product_Group_Code VARCHAR(9) NOT NULL
);
INSERT INTO mytable(No_,Description,Product_Group_Code) VALUES (3856005147540,'MS MS-500 napajanje 500W','NAPAJANJE');
INSERT INTO mytable(No_,Description,Product_Group_Code) VALUES (8600412596522,'Teracell Flip Cover preklopna','FUTMASMOB');
INSERT INTO mytable(No_,Description,Product_Group_Code) VALUES (8600412615940,'Teracell Evo kabl za iph crni','KABLZAMOB');
INSERT INTO mytable(No_,Description,Product_Group_Code) VALUES (8806090987564,'Samsung Galaxy A52 crni','MOBTELEF');

标签: sql-servernavision

解决方案


推荐阅读