SQL SELECT语句上的计数器基于当前行的值

时间:2015-09-16 13:25:58

标签: sql sql-server sql-server-2008

我有以下SQL表(第一个表),其中此表存储特定商店的订单。我不确定它是否可行,但我想制作一个类似第二张表的视图。

字段orderNumber保存特定订单的编号。具有相同订单号的行意味着属于相同的订单。

所以基于orderNumber和第一个表的类型,我想生成字段dealCounter(参见第二个表),其中计算每个订单的交易数量,并将相同数量的dealCounter分配给属于的所有行同样的订单。

每次我们找到类型12,然后我们将dealCounter增加1。如果我们更改orderNumber,则重置dealCounter。

我尝试使用rank()函数,但我无法管理dealCounter并设置我想要的值。

有什么方法可以解决我的问题吗?

menuid  type  orderNumber  storeNumber  lineNumber
---------------------------------------------------
10       12    100122       10          0
8        9     100122       10          1
5        9     100122       10          2
3        9     100122       10          3
11       12    100122       10          4
5        9     100122       10          5
3        9     100122       10          6
10       12    100122       10          7
8        9     100122       10          8
5        9     100122       10          9
3        9     100122       10          10
10       12    100123       10          0
8        9     100123       10          1
5        9     100123       10          2
3        9     100123       10          3
11       12    100123       10          4
5        9     100123       10          5
3        9     100123       10          6


dealCounter  menuid  type  orderNumber  storeNumber  lineNumber
---------------------------------------------------------------
1            10       12    100122       10           0
1            8        9     100122       10           1
1            5        9     100122       10           2
1            3        9     100122       10           3
2            11       12    100122       10           4
2            5        9     100122       10           5
2            3        9     100122       10           6
3            10       12    100122       10           7
3            8        9     100122       10           8
3            5        9     100122       10           9
3            3        9     100122       10           10
1            10       12    100123       10           0
1            8        9     100123       10           1
1            5        9     100123       10           2
1            3        9     100123       10           3
2            11       12    100123       10           4
2            5        9     100123       10           5
2            3        9     100123       10           6

2 个答案:

答案 0 :(得分:2)

您可以使用CROSS APPLY

SELECT t3.cnt AS dealCounter, menuid, type,  orderNumber, storeNumber
FROM mytable AS t1
CROSS APPLY (
   SELECT COUNT(CASE WHEN type = 12 THEN 1 END) AS cnt
   FROM mytable AS t2
   WHERE t1.orderNumber = t2.orderNumber 
         AND t2.lineNumber <= t1.lineNumber) AS t3

对于mytable的每一行,我们都应用CROSS APPLY运算符,以便获得之前或与行相同的type=12条记录的数量在同一个orderNumber切片内。

Demo here

答案 1 :(得分:1)

select 
  sum(case when type=12 then 1 end) 
    over (partition by ordernumber order by lineNumber) as dealCounter, 
  menuid,  type,  orderNumber,  storeNumber
from your_table;

这是一个运行总和(我们按行号排序),考虑到1,其中type = 12。计数器将在每个新订单号(分区依据)

时重置

编辑:使用Giorgios的小提琴。尽管你的版本说评论者不支持运行总和,但这似乎在sqlfiddle上运行正常。 Result