如何在SQL中编写查询以按月生成报告

时间:2019-07-04 09:37:59

标签: sql sql-server

我有全年的接收和发送数据。所以我想根据该数据建立每月报告,规则是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

谢谢!

1 个答案:

答案 0 :(得分:0)

我不清楚您的问题。 如果您只想使用FIFO方法,因此忽略表中包含的任何数据,则必须按ID(在您的示例中提供)进行排序,并且看起来像是按插入顺序进行。

插入的第一行也应该是select(FIFO)中出现的第一行,为此,您必须使用:

ORDER BY Id ASC

首先将ID的下限值(1、2、3,...)

对我而言,这没有多大意义,因此请注意示例中实际包含的数据的含义,并利用诸如ReceivingDate之类的日期进行排序,甚至可以按日期的月份进行过滤,例如以下一月份的数据:

WHERE MONTH(ReceivingDate) = 1