SQL Server:计算所有产品和销售数据

时间:2016-04-20 11:28:46

标签: sql sql-server count counting

我有两个表ProductSales,结构如下:

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开始。

我可以使用存储过程执行此操作,但如果可能,我想为此部分创建查询。

感谢您的帮助。

2 个答案:

答案 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;