2015-04-25 38 views
-4

我的行數表像查找每個值

Name 
A 
B 
B 
C 
C 
C 
A 
A 
B 
B 

我需要查詢像

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

我試圖與秩()返回輸出,DENSE_RANK()。但我不能夠得到輸出

+2

到目前爲止您嘗試過什麼?顯然,我們不想浪費你的時間來表明你已經嘗試了很多東西。請相應地編輯您的問題。 –

+0

這非常簡單。谷歌搜索給你很多例子,像http://www.w3resource.com/sql/aggregate-functions/count-with-group-by.php。請閱讀http://stackoverflow.com/help/how-to-ask。在我們嘗試幫助您之前,您應該嘗試幫助您自己 –

+1

按行排序的行是什麼?你怎麼確定前2個B是一個組,最後2個是不同組? – Mureinik

回答

1

在我看來這個問題它不投下它,它很有趣,反正讓我們去解決方案。

爲了對名稱進行分組並獲得每個分隔組中的名稱計數,帶有分組函數或窗口函數的簡單計數函數不能解決您的問題,我傾向於使用兩個輔助字段,一個用於行號,其他適用於組數的值,你會通過你的表迭代,提高組字段的值的下一個名字,如果它是不一樣的電流:

假設你的表是:

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 
+0

我同意這不是微不足道的問題,沒有downvote,但OP沒有提供任何專欄訂購項目。 您的解決方案是錯誤的,因爲**沒有保證**第一個子查詢爲了將它們放入表中而給出行。 如果訂購的列被提供,他們是不同的,增加 - 解決方案是可能的,你的是其中之一,非常相似[http://stackoverflow.com/questions/29849314/how-to-dense-rank-最近問及回答了價值套重複)。 –

+0

@PonderStibbons,'1.'如果你覺得帖子不是或者是好的,有用的,你可以自由地投降或投票。 ''2.你提到的問題不是很相似。 ''我的解決方案沒有錯,請在測試它之前先告訴它。 '4。「這種解決方案恰好適用於沒有排序條件的列,不要以爲我們總是需要有一個列進行排序。 5,你告訴_that第一個子查詢給出了行,以便將它們放入table_中,這是正確的,希望子查詢應該這樣做。無論如何,我歡迎您的評論。祝你好運。 – jfun

+0

1)我會2)他們是3)是錯誤的,因爲沒有保證的順序,否則我會upvote它4)唯一的選擇是rowid,這是致命的5),但從我們知道哪一行放在第一位? –

-1

可以實現您的要求非常簡單,以下查詢

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

嗨kumar ..你試過這個查詢或不嘗試你會得到準確的結果..你你不喜歡這個帖子可以請解釋 – ganesh