代码之家  ›  专栏  ›  技术社区  ›  mad

使用SQL Server甚至使用while循环获取每日库存

  •  0
  • mad  · 技术社区  · 8 年前

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

    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. 我如何用日期显示每天的库存?如果我也添加日历表,我如何才能获得 2015-11-03 产品条形码和数量截止日期 2015-12-15 相同的产品条形码如下 (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的初学者,试图了解是否有可能解决这个问题。 提前感谢你的帮助。

    我试过这里的日历表

    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
    
    2 回复  |  直到 8 年前
        1
  •  0
  •   Sagar Shelke    8 年前

    我正在使用库存临时表,您可以用库存表替换它。

    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的值。

        2
  •  0
  •   hieubv.cntt    8 年前

    希望能有所帮助

    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