使用 SQL 服务器甚至使用 while 循环获取每日库存

Get daily inventory using SQL Server even using while loop

我有一个库存盘点 table,其中包含每月一次的日期条目以及库存余额不可能存在的所有其他日期条目。我遇到的问题是我需要生成一份显示所有天的每日余额的报告。

StoreNo   Date     ProductBarCode  ProducQty
--------------------------------------------
    61  2015-11-03  2300007115072   7
    61  2015-12-15  2300012213046   5
    21  2016-01-03  2300012712075   8
    61  2016-03-04  2300019012093   7
    61  2016-04-29  2017961746012   100
    61  2016-06-29  0065103700004   33

我要展示每日基地库存!

我确实有两个问题

  1. 如何显示每天的带日期库存?如果我也添加日历 table,我怎样才能获得 2015-11-03 productBarcode 和 Qty 直到 2015-12-15 相同的 productBarcode 像这样 (61 2015-11-03 2300007115072 7)

  2. 如果我选择 @date1 = 2015-11-05@date2= 2015-11-08 我仍然想在没有显示产品的选定日期显示这样的结果。

这样的结果

StoreNo   Date     ProductBarCode  ProducQty
--------------------------------------------
    61  2015-11-05  2300007115072   7
    61  2015-11-06  2300007115072   7
    61  2015-11-07  2300007115072   7
    61  2015-11-08  2300007115072   7

过去一周我遇到了这个问题!我找不到任何解决方案..

我是 SQL 的初学者,正在尝试了解是否有解决此问题的可能性。 预先感谢您的帮助。

我在这里 table 尝试了日历

Declare 
     @date1 date = '2015-12-01',
     @date2 date = '2015-12-05',
     @date_index date

create Table #calendar (Date date)

SET @date_index = @date1

WHILE @date_index <= @date2
BEGIN
    INSERT INTO #calendar
       SELECT @date_index

    SET @date_index = dateadd(day, 1, @date_index)

    IF @date_index > @date2
       BREAK
    ELSE
       CONTINUE
END

我正在使用临时 table 作为库存,您可以将其替换为您的库存 table。

create table #inventory (StoreNo int ,[Date] date, ProductBarCode varchar(14),ProductQty int )

insert into #inventory

SELECT 61,  '2015-11-03',  '2300007115072',   7   UNION ALL
SELECT 61,  '2015-12-15',  '2300012213046',   5   UNION ALL
SELECT 21,  '2016-01-03',  '2300012712075',   8   UNION ALL
SELECT 61,  '2016-03-04',  '2300019012093',   7   UNION ALL
SELECT 61,  '2016-04-29',  '2017961746012',   100 UNION ALL
SELECT 61,  '2016-06-29',  '0065103700004',   33  


DECLARE @dt1 Datetime='2015-11-05'
DECLARE @dt2 Datetime='2015-11-08'

;WITH ctedaterange 
     AS (SELECT [Dates]=@dt1 
         UNION ALL
         SELECT [dates] + 1 
         FROM   ctedaterange 
         WHERE  [dates] + 1<= @dt2) 
SELECT A.StoreNo,C.[dates],A.ProductBarCode,A.ProductQty
FROM   ctedaterange C
OUTER APPLY 
(
    SELECT TOP 1 * FROM #inventory I WHERE I.Date < C.DATES ORDER BY I.Date DESC
) A
OPTION (maxrecursion 0)

它也适用于其他日期范围。只需更改@dt1 和@dt2 的值即可。

希望有所帮助

Declare @date1 date = '2015-12-01'
              ,@date2 date = '2015-12-05'
              ,@date_index date
create Table #calende  (Date date)
SET @date_index = @date1

WHILE @date_index<=@date2
BEGIN
INSERT INTO #calende
SELECT @date_index

SET @date_index = dateadd(day,1,@date_index)

IF @date_index>@date2
Break
ELSE
Continue
END

select (CASE WHEN I.[Date] IS NULL THEN 61
            ELSE
                I.[StoreNo]
        END) AS StoreNo ,
        C.[Date],
        (CASE WHEN I.[Date] IS NULL THEN 61
            ELSE
                I.[StoreNo]
        END) AS StoreNo ,
        (CASE WHEN I.[Date] IS NULL THEN 2300007115072
            ELSE
                I.[ProductBarCode]
        END) AS ProductBarCode ,
        (CASE WHEN I.[Date] IS NULL THEN 7
            ELSE
                I.[ProducQty]
        END) AS ProducQty ,      
from #calende C
    left join [YourTable] I on I.[Date] = C.[Date]

drop table #calende