当列B改变值时增加列A.

时间:2013-09-18 15:15:07

标签: oracle reporting-services plsql rownum

我正在使用PL / SQL(Oracle),这是我目前从一个简单的选择查询得到的结果(带有一个订单):

Name        Hour        Value
---------------------------------
Peter       1           10
Peter       2           12
Peter       3           22
Joe         1           8
Joe         2           8
Joe         3           12
Richard     1           9
Richard     2           7
Matt        1           11

在SSRS中,我有一个复杂的矩阵,我希望有交替的行颜色*。因此,我需要rownumber,但必须按名称“分组”。所以这就是我想要的:

Name        Hour        Value        Row_Num
--------------------------------------------
Peter       1           10           1
Peter       2           12           1
Peter       3           22           1
Joe         1           8            2
Joe         2           8            2
Joe         3           12           2
Richard     1           9            3
Richard     2           7            3
Matt        1           11           4

请注意Row_Num(或任何您想要调用的内容)仅在Name更改时才会更改。这可能在PL / SQL中吗?

*我知道在SSRS中获取交替行颜色的技术,但是我使用了一个矩阵,并且在对艾哈迈德回答this question的评论中提到了Kyle Hale提到的问题。

2 个答案:

答案 0 :(得分:4)

使用查询结果中的dense_rank()函数很容易做到这一点:

select name, hour, value,
       dense_rank() over (order by name) as row_num
from t;

注意:这不一定按照您给出的顺序分配值。但是每个小组都会得到不同的价值。如果您按照给定的顺序需要它们,那么您需要确定订单。 SQL表本质上是无序的,因此需要一列来指定排序。

答案 1 :(得分:2)

select  name
,       value
,       hour
,       dense_rank() over (partition by 1 order by name) as row_num
from
(
        select 'Peter' name,  '1' hour , '10' value from dual union all
        select 'Peter',  '2', '12' from dual union all
        select 'Peter',  '3', '22' from dual union all
        select 'Joe',    '1', '8'  from dual union all
        select 'Joe',    '2', '8'  from dual union all
        select 'Joe',    '3', '12' from dual union all
        select 'Richard','1', '9'  from dual union all
        select 'Richard','2', '7'  from dual union all
        select 'Matt',   '1', '11' from dual
)

Joe     8   2   1
Joe     12  3   1
Joe     8   1   1
Matt    11  1   2
Peter   22  3   3
Peter   12  2   3
Peter   10  1   3
Richard 9   1   4
Richard 7   2   4