找到每个值的行数

时间:2015-04-25 07:53:31

标签: sql sql-server oracle

我有像

这样的表格
Name
A
B
B
C
C
C
A
A
B
B

我需要Query来返回输出,如

Name         count
A             1
B             2
C             3
A             2
B             2

我尝试使用rank(),dense_Rank()。但我无法获得输出

2 个答案:

答案 0 :(得分:1)

在我看来,这个问题不是要投票,它很有意思,无论如何我们都可以继续解决。

为了对名称进行分组并获取每个分隔组中的名称计数,带有group by或window函数的简单计数函数无法解决您的问题,我更喜欢使用两个辅助字段,一个用于行号,另一个包含组号的值,如果它与当前名称不同,您将遍历您的表并增加组字段的值:

假设你的桌子是:

create table tblN (Name varchar(10))
insert into tblN values
('A'),
('B'),
('B'),
('C'),
('C'),
('C'),
('A'),
('A'),
('B'),
('B');

以下查询是针对上述说明的:

    ;with cte1 as(
        select 1 gp,name -- add gp for group number
        from tblN
      ),
    cte2 as(
        select gp,name,
               row_number() over(order by gp) rn --add rn for evaluating groups 
        from cte1
      ),
    cte3 as(
        select gp,name,rn from cte2 where rn=1
        union all
        select case --evaluate groups
                when c2.name=c3.name then c3.gp 
                else c3.gp+1
               end gp,
               c2.name,c2.rn
        from cte3 c3
        join cte2 c2 on c3.rn+1=c2.rn
      )
select gp,name from cte3 --[1]

结果:

gp  name
1   A
2   B
2   B
3   C
3   C
3   C
4   A
4   A
5   B
5   B

现在在上面的查询而不是行[1]中使用下面的查询:

select name , count from(
select top 1000 gp,name,
       count(name) count
from cte3
group by gp,name
order by gp) q

结果:

name    count
A       1
B       2
C       3
A       2
B       2

答案 1 :(得分:-1)

您可以通过以下查询轻松达到您的要求

SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) AS COUNT,NAME FROM TABLENAME )T ORDER BY 1,2