2015-09-14 75 views
3

的順序出現我有如下表2列SQL分組由價值

ID  |  Dept 

1  | A  
2  | A 
3  | B 
4  | B 
5  | B 
6  | A 

我想做一個計數使得輸出應該如下表所示。

Dept |  Count 

A  | 2  
B  | 3 
A  | 1 

感謝您的幫助提前!

+1

我不明白,你爲什麼要爲部門A的兩個記錄? A部門在表中有3條記錄。 – HoneyBadger

+2

到目前爲止您的嘗試是什麼? – Goose

+0

你能澄清一下輸出是否正確,即應該只有一個應該有一個計數爲3的結果。你提到COUNT這有點誤導。 –

回答

5

略有不同,邁克爾的,相同的結果:

with cte1 as (
    select id, 
      dept, 
      row_number() over (partition by dept order by id) - 
      row_number() over (order by id) group_num 
    from  test), 
cte2 as (
    select dept, 
      group_num, 
      count(*) c_star, 
      max(id) max_id 
    from  cte1 
    group by dept, 
      group_num) 
select dept, 
     c_star 
from  cte2 
order by max_id; 

http://sqlfiddle.com/#!4/ff747/1

+0

我更喜歡你的方法,因爲它使用'row_number()(按ID排序)'而不是'id',這意味着它更強大,以防ids不是順序或非整數。 –

+0

歡呼聲 - 是的,我想這是一種可能性。 –

+0

是的,這將是一個更好的選擇... –

-2

運行此查詢此:

SELECT Dept, count(*) FROM table_name group By Dept 
+2

你能檢查一下他的預期輸出嗎 –

0

你不能用SQL做到這一點。計數會計算不同的項目,因此您的案例中的計數會給您計數A和計數B

您只能按表格中的值進行計數/分組,而不能按行的順序進行計數/分組。如果您不使用order by,則在SQL中不保證順序。

+0

這種情況下的命令可能是id。我不認爲這是不可能的,但確實看起來很不方便。 –

+0

他的問題是count()函數和如何得到他想要的。他不能。 – mikeb

+0

問題是「你怎麼能得到這個輸出」,並且他認爲他可以使用COUNT()來輕鬆獲得輸出。其結果本身可能不是在SQL中無法實現的。 –

1

從你的例子看來,你想要爲每個部門計算連續記錄。

您可以通過組合行號和排序ID來完成此操作。

create table tblDept (
    id int not null, 
    dept varchar(50) 
); 

insert into tblDept values (1, 'A'); 
insert into tblDept values (2, 'A'); 
insert into tblDept values (3, 'B'); 
insert into tblDept values (4, 'B'); 
insert into tblDept values (5, 'B'); 
insert into tblDept values (6, 'A'); 

with orderedDepts as (
    select 
    dept, 
    id, 
    row_number() over (partition by dept order by id) - 
     row_number() over (order by id) as rn 
    from tblDept 
) 
select 
    dept, 
    count(*) as num 
from orderedDepts 
group by 
    dept, 
    rn 
order by 
    max(id) 

給人的輸出:

+------+-----+ 
| DEPT | NUM | 
+------+-----+ 
| A | 2 | 
| B | 3 | 
| A | 1 | 
+------+-----+ 

SQL Fiddle

+0

需要指出的是,如果兩個連續的ID之間有相同的部門之間的差距,這將無法正常工作 –

+1

@DeepakPawar更新了答案以涵蓋這種情況......我最初的假設可能是錯誤的。 –