SQL Server中指定值的累计计数

时间:2013-12-29 10:47:22

标签: sql-server

我在Sql Sever中有一个看起来像这样的表,

Br     Type    Sales
102     A       20
102     B       10
102     D       8
102     F       12
103     A       18
103     C       7
103     D       15
103     E       3

我想在SQL Server中创建一个新表,它在上面的现有表中添加一列,为每个唯一的Br列提供累计计数,并根据销售列对数据Ascending进行排序。

新表应如下所示,

BrCount    Br     Type    Sales
1          102     D       8
2          102     B       10
3          102     F       12
4          102     A       20
1          103     E       3
2          103     C       7
3          103     D       15
4          103     A       18

我不知道从哪里开始。我想过使用某种循环,在每次迭代时分析一行中包含的Br编号,并使用前一个值+ 1更新BrCount列,或者如果上一行中的Br编号不匹配则只更新1,但我很难找到这种循环的例子。

2 个答案:

答案 0 :(得分:1)

您可以使用排名函数ROW_NUMBER()来执行此操作:

SELECT 
  ROW_NUMBER() OVER(PARTITION BY br
                    ORDER BY Sales) AS BRCount,
  Br, 
  Type,
  Sales
FROM SalesTable;

这会给你:

| BRCOUNT |  BR | TYPE | SALES |
|---------|-----|------|-------|
|       1 | 102 |    D |     8 |
|       2 | 102 |    B |    10 |
|       3 | 102 |    F |    12 |
|       4 | 102 |    A |    20 |
|       1 | 103 |    E |     3 |
|       2 | 103 |    C |     7 |
|       3 | 103 |    D |    15 |
|       4 | 103 |    A |    18 |

答案 1 :(得分:1)

根据您的示例,您要查找的是使用ranking functions之一的现有表格上的查询

SELECT 
  Rank() OVER(PARTITION BY br BY Sales) AS BRCount,
  Br, 
  Type,
  Sales
FROM MyTable

您可能希望使用RANKDENSE_RANKROW_NUMBER。您可以阅读更多关于this优秀SO线程的差异。