Получайте ежедневную инвентаризацию с помощью SQL Server, даже используя цикл while

У меня есть таблица запасов инвентаризации, в которой есть запись для даты один раз в месяц, а для всех других дат, когда баланс запасов не может быть. Проблема, которая у меня есть, заключается в том, что мне нужно создать отчет, который показывает ежедневные остатки за все дни.

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 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, пытаясь узнать, есть ли какие-либо возможности для решения этой проблемы. Заранее спасибо за помощь.

Я попробовал календарную таблицу здесь

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

person mad    schedule 19.08.2016    source источник
comment
для всех дат между 12-12 и 01-03 показать productqty 5   -  person TheGameiswar    schedule 19.08.2016
comment
@TheGameiswar выше был образцом таблицы, у меня есть 120 магазинов с номерами и productBarcode 1000 каждый из них, чтобы показать результат до даты ..   -  person mad    schedule 19.08.2016


Ответы (2)


Я использую временную таблицу для инвентаризации, которую вы можете заменить своей таблицей инвентаризации.

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.

person Sagar Shelke    schedule 19.08.2016
comment
StoreNo dates ProductBarCode ProductQty 916 2015-12-02 00:00:00.000 2300000314076 18 916 2015-12-03 00:00:00.000 2300000314076 18 61 2015-12-04 00:00:00.000 2300007115072 7 61 2015-12-05 00:00:00.000 2300007115072 7 61 2015-12-06 00:00:00.000 2300007115072 7 после 916 после 2015-12-03 количество не отображается, а 61 после 3-го показывает только его значение, потому что инвентаризация проведена 3-го для 61, поэтому он отображается после этого, но я хочу показать предыдущие даты также 2-й и 3-й - person mad; 19.08.2016
comment
Извиняюсь! Я не понял, что вы говорите. Не могли бы вы привести пример данных и ожидаемый результат, который поможет понять это. - person Sagar Shelke; 19.08.2016
comment
StoreNo date ProductBarCode ProductQty NULL 2015-12-01 NULL NULL NULL 2015-12-02 NULL NULL NULL 2015-12-03 NULL NULL 61 2015-12-04 2300007115072 7 61 2 015-12-04 2300012213046 5 61 2015-12-04 2300012712075 8 У меня был такой результат! НО я также не могу показать NULL в эти даты - person mad; 19.08.2016

Надеюсь поможет

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
person hieubv.cntt    schedule 19.08.2016