使用 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
我要展示每日基地库存!
我确实有两个问题
如何显示每天的带日期库存?如果我也添加日历 table,我怎样才能获得 2015-11-03
productBarcode 和 Qty 直到 2015-12-15
相同的 productBarcode 像这样 (61 2015-11-03 2300007115072 7)
如果我选择 @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
我有一个库存盘点 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
我要展示每日基地库存!
我确实有两个问题
如何显示每天的带日期库存?如果我也添加日历 table,我怎样才能获得
2015-11-03
productBarcode 和 Qty 直到2015-12-15
相同的 productBarcode 像这样(61 2015-11-03 2300007115072 7)
如果我选择
@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