我有两个表Product
和Sales
,结构如下:
Product
表:
ProductID | Name
1 | Product 1
2 | Product 2
3 | Product 3
Sales
表:
SalesID | Time | ProductID | Sales
01 | 201601 | 1 | 10
02 | 201602 | 1 | 11
03 | 201603 | 1 | 13
04 | 201604 | 2 | 1
05 | 201601 | 3 | 12
06 | 201602 | 2 | 5
06 | 201608 | 3 | 3
06 | 201609 | 3 | 4
我想得到这样的观点:
ProductName | Time | counter | Sales
Product 1 | 201601 | 0 | 10
Product 1 | 201602 | 1 | 11
Product 1 | 201603 | 2 | 13
Product 2 | 201604 | 0 | 1
Product 3 | 201601 | 0 | 12
Product 2 | 201602 | 1 | 5
Product 3 | 201608 | 1 | 3
Product 3 | 201609 | 2 | 4
所以基本上我的柜台只是一个专栏,根据产品和时间向我展示第一笔销售。我的柜台必须从0开始,它计算我对这个产品的销售量。
例如,对于产品1,第一次销售是在201601年,第二次销售是在201602年等。
根据我需要做的产品,每次销售:Counter = counter + 1如果我有新产品,我的计数器必须再次从0开始。
我可以使用存储过程执行此操作,但如果可能,我想为此部分创建查询。
感谢您的帮助。
答案 0 :(得分:4)
正如Kumar所指出的那样,当序列只是顺序时,你可以使用行号和分区:
SELECT
p.Name,
s.Time,
(ROW_NUMBER() OVER (PARTITION BY s.ProductId ORDER BY s.ProductId, s.Time) - 1) AS Counter,
s.Sales
FROM [Sales] s
LEFT JOIN [Product] p ON p.ProductId = s.ProductId
答案 1 :(得分:2)
您正在寻找row_number()
:
select p.productname, s.time,
row_number() over (partition by s.productid order by time) as counter,
s.sales
from sales s join
product p
on s.productid = p.productid
order by time;