英文:
SQL Query for Stock Summary Per Date Based Only on Transactional Data
问题
我需要制作一个仅基于交易数据表的库存报告。
例如,我有这样的表格,其中ProductType确定库存是进还是出(+表示进货,-表示出货)
产品ID | 数量 | 产品类型 | 日期 |
---|---|---|---|
1 | 630 | 1 | 2021-10-11 |
1 | 630 | -1 | 2021-10-11 |
1 | 630 | 1 | 2021-10-12 |
1 | 630 | 1 | 2021-10-12 |
1 | 430 | -1 | 2021-10-13 |
基于输入的参数,即产品ID、开始日期和结束日期,我希望根据数据制作如下表格,假设开始数量为0。
产品ID | 日期 | 开始数量 | 进货数量 | 出货数量 | 结束数量 |
---|---|---|---|---|---|
1 | 2021-10-11 | 0 | 630 | 0 | 630 |
1 | 2021-10-11 | 630 | 0 | 630 | 0 |
1 | 2021-10-12 | 630 | 630 | 0 | 630 |
1 | 2021-10-12 | 630 | 630 | 0 | 1260 |
1 | 2021-10-13 | 1260 | 0 | 430 | 830 |
非常感谢您的帮助!谢谢!
英文:
I have an assignment to make an inventory report only based on the transactional data table.
For example, I have the table like this, where ProductType determines whether the stock is going in or out (+ for stock in and - for out)
ProductID | Quantity | ProductType | Date |
---|---|---|---|
1 | 630 | 1 | 2021-10-11 |
1 | 630 | -1 | 2021-10-11 |
1 | 630 | 1 | 2021-10-12 |
1 | 630 | 1 | 2021-10-12 |
1 | 430 | -1 | 2021-10-13 |
And based on the data I want to make it look like this based on the parameter inputted which is productid, beginning date, and end date. Assuming the beginning quantity is 0.
ProductID | Date | Beginning Quantity | Quantity In | Quantity Out | Ending Quantity |
---|---|---|---|---|---|
1 | 2021-10-11 | 0 | 630 | 0 | 630 |
1 | 2021-10-11 | 630 | 0 | 630 | 0 |
1 | 2021-10-12 | 630 | 630 | 0 | 630 |
1 | 2021-10-12 | 630 | 630 | 0 | 1260 |
1 | 2021-10-13 | 1260 | 0 | 430 | 830 |
Any help will be much appreciated, thank you!
答案1
得分: 1
以下是翻译好的内容:
一个示例如何执行此操作。如果您有交易ID,则请使用它来代替row_number()
,因为这只是一种在一天内拆分金额的方法。
create table Products (ProductID int, Quantity int, ProductType int, [Date] datetime)
insert into Products
values
(1, 630, 1, '2021-10-11'),
(1, 630, -1, '2021-10-11'),
(1, 630, 1, '2021-10-12'),
(1, 630, 1, '2021-10-12'),
(1, 430, -1, '2021-10-13')
declare @productID int = 1,
@Beg_Dte date = '2021-10-01',
@End_Dte date = '2021-10-31';
with input_data as(
select
row_number()over(partition by ProductID order by [Date]) as ID,
ProductID,
[Date],
Quantity*ProductType as Qty,
iif(ProductType>0,Quantity,0) as [Quantity In],
iif(ProductType<0,Quantity,0) as [Quantity Out],
lag(Quantity*ProductType,1,0)over(partition by ProductID order by ProductID,[Date]) as Beg
from Products
)
select ID, ProductID, [Date],
sum(Beg)over(partition by ProductID order by ID) as [Beginning Quantity],
[Quantity In],
[Quantity Out],
sum(Beg)over(partition by ProductID order by ID)+Qty as [Ending Quantity]
from input_data
where ProductID = @productID
and [Date] between @Beg_Dte and @End_Dte
另外,递归CTE或CASE
语句也应该起作用。
如果您没有交易ID,请考虑结果集的另一种表示形式。也许更好的做法是每天只显示一行。这样更容易组织。类似于以下内容:
ProductID | Date | Beginning Quantity | Quantity In | Quantity Out | Ending Quantity |
---|---|---|---|---|---|
1 | 2021-10-11 | 0 | 630 | 630 | 0 |
1 | 2021-10-12 | 0 | 1260 | 0 | 1260 |
1 | 2021-10-13 | 1260 | 0 | 430 | 830 |
顺便说一句,这一行存在错误。Beginning Quantity 应该为零。
ProductID | Date | Beginning Quantity | Quantity In | Quantity Out | Ending Quantity |
---|---|---|---|---|---|
1 | 2021-10-12 | 630 | 630 | 0 | 630 |
英文:
One example of how to do this. If you have transaction ID then use it instead of row_number()
because it is just a way how to split the amounts within one day.
create table Products (ProductID int, Quantity int, ProductType int, [Date] datetime)
insert into Products
values
(1, 630, 1, '2021-10-11'),
(1, 630, -1, '2021-10-11'),
(1, 630, 1, '2021-10-12'),
(1, 630, 1, '2021-10-12'),
(1, 430, -1, '2021-10-13')
declare @productID int = 1,
@Beg_Dte date = '2021-10-01',
@End_Dte date = '2021-10-31';
with input_data as(
select
row_number()over(partition by ProductID order by [Date]) as ID,
ProductID,
[Date],
Quantity*ProductType as Qty,
iif(ProductType>0,Quantity,0) as [Quantity In],
iif(ProductType<0,Quantity,0) as [Quantity Out],
lag(Quantity*ProductType,1,0)over(partition by ProductID order by ProductID,[Date]) as Beg
from Products
)
select ID, ProductID, [Date],
sum(Beg)over(partition by ProductID order by ID) as [Beginning Quantity],
[Quantity In],
[Quantity Out],
sum(Beg)over(partition by ProductID order by ID)+Qty as [Ending Quantity]
from input_data
where ProductID = @productID
and [Date] between @Beg_Dte and @End_Dte
In addition, recursive CTE or CASE
statements also should work.
If you do not have transaction ID, think about the another representation of the result set. Maybe it is better to show only one row for each day. It should be easier to organise. Something like this:
ProductID | Date | Beginning Quantity | Quantity In | Quantity Out | Ending Quantity |
---|---|---|---|---|---|
1 | 2021-10-11 | 0 | 630 | 630 | 0 |
1 | 2021-10-12 | 0 | 1260 | 0 | 1260 |
1 | 2021-10-13 | 1260 | 0 | 430 | 830 |
By the way, there is an error in this line. Beginning Quantity should be zero.
ProductID | Date | Beginning Quantity | Quantity In | Quantity Out | Ending Quantity |
---|---|---|---|---|---|
1 | 2021-10-12 | 630 | 630 | 0 | 630 |
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论