2017-04-03 67 views
1

與組SQL我有一個包含4列 作爲計數由

create table Temp 
(
seqno int identity (1,1), 
name varchar(20), 
towncd numeric, 
Counttown_cd, 

) 

我想編寫查詢它返回的鎮計數,但如果名稱和towncd相同 再算上罩在前面加表溫度記錄 像

1 man 0001 
2 man 0001 
3 test 0003 
4 man 0001 
5 man 0001 

它768,16返回 作爲

1 man 0001 2 
    2 man 0001 null 
    3 test 0003 1 
    4 man 0001 2 
    5 man 0001 null 

我有嘗試以下查詢:

SELECT p.seqno ,p.name,P.towncd ,COUNT(P.towncd)Counttown_cd 
       FROM temp P 
       GROUP BY P.name,P.towncd ,p.seqno 
       order by p.seqno 
+1

輸出爲3測試0003應爲1或2 ? – etsa

+0

@etsa 1它只是我嘗試創建的虛擬數據,我們需要計算no鎮cd – mandes

回答

6

你編輯你的問題中的差距和島嶼問題原來的問題。這可以通過兩個row_number() S IN子查詢來解決,像這樣:

select seqno, name, towncd 
    , Counttown_cd = case 
     when row_number() over (partition by name,towncd,grp order by seqno) = 1 
     then count(*) over (partition by name,towncd, grp) 
     else null 
     end 
from (
    select * 
    , grp = row_number() over (partition by name,towncd order by seqno) 
      - row_number() over (order by seqno) 
    from temp 
    ) t 
order by seqno 

rextester演示:http://rextester.com/VGXI71945

回報:

+-------+------+--------+--------------+ 
| seqno | name | towncd | Counttown_cd | 
+-------+------+--------+--------------+ 
|  1 | man | 0001 | 2   | 
|  2 | man | 0001 | NULL   | 
|  3 | test | 0003 | 1   | 
|  4 | man | 0001 | 2   | 
|  5 | man | 0001 | NULL   | 
+-------+------+--------+--------------+ 


回答原來的問題:

使用case表達式和兩個窗口函數(row_number()count(*) over()),以只顯示計數的name,towncd第一個實例:

select seqno, name, towncd 
    , Counttown_cd = case 
     when row_number() over (partition by name,towncd order by seqno) = 1 
     then count(*) over (partition by name,towncd) 
     else null 
     end 
from temp 

rextester演示:http://rextester.com/NZSPR13395

回報:

+-------+------+--------+--------------+ 
| seqno | name | towncd | Counttown_cd | 
+-------+------+--------+--------------+ 
|  1 | man | 0001 | 2   | 
|  2 | man | 0001 | NULL   | 
|  3 | test | 0003 | 1   | 
+-------+------+--------+--------------+ 
+0

@etsa如果期望的結果對於'seqno = 3'是正確的,則不會。在期望的結果中'counttown_cd'對於'seqno = 3'是'1'。如果'counttown_cd'對於'seqno = 3'應該是'2',那麼使用'sum()'而不是'count()'。 – SqlZim