我有全年的接收和发送数据。所以我想根据该数据建立每月报告,规则是Fisrt先进先出。这意味着第一个接收将首先发送出去...
DECLARE @ReceivingTbl AS TABLE(Id INT,ProId int, RecQty INT,ReceivingDate DateTime)
INSERT INTO @ReceivingTbl
VALUES (1,1001,210,'2019-03-12'),
(2,1001,315,'2019-06-15'),
(3,2001,500,'2019-04-01'),
(4,2001,10,'2019-06-15'),
(5,1001,105,'2019-07-10')
DECLARE @SendTbl AS TABLE(Id INT,ProId int, SentQty INT,SendMonth int)
INSERT INTO @SendTbl
VALUES (1,1001,50,3),
(2,1001,100,4),
(3,1001,80,5),
(4,1001,80,6),
(5,2001,200,6)
SELECT * FROM @ReceivingTbl ORDER BY ProId,ReceivingDate
SELECT * FROM @SendTbl ORDER BY ProId,SendMonth
Id ProId RecQty ReceivingDate
1 1001 210 2019-03-12
2 1001 315 2019-06-15
5 1001 105 2019-07-10
3 2001 500 2019-04-01
4 2001 10 2019-06-15
Id ProId SentQty SendMonth
1 1001 50 3
2 1001 100 4
3 1001 80 5
4 1001 80 6
5 2001 200 6
---以下是我想要的:
Id ProId RecQty ReceivingDate ... Mar Apr May Jun
1 1001 210 2019-03-12 ... 50 100 60 0
2 1001 315 2019-06-15 ... 0 0 20 80
5 1001 105 2019-07-10 ... 0 0 0 0
3 2001 500 2019-04-01 ... 0 0 0 200
4 2001 10 2019-06-15 ... 0 0 0 0
谢谢!
答案 0 :(得分:0)
我不清楚您的问题。 如果您只想使用FIFO方法,因此忽略表中包含的任何数据,则必须按ID(在您的示例中提供)进行排序,并且看起来像是按插入顺序进行。
插入的第一行也应该是select(FIFO)中出现的第一行,为此,您必须使用:
ORDER BY Id ASC
首先将ID的下限值(1、2、3,...)
对我而言,这没有多大意义,因此请注意示例中实际包含的数据的含义,并利用诸如ReceivingDate之类的日期进行排序,甚至可以按日期的月份进行过滤,例如以下一月份的数据:
WHERE MONTH(ReceivingDate) = 1