2015-10-22 22 views
1

檢索我有一個表36列,但其中一列有數據多次像下面COUNTIF型函數,其中總計數可在其他列

ID  Name  Ref 
abcd john doe 123 
1234 martina  100 
123x brittany 123 
ab12 joe   101 

,我想像

結果
ID  Name  Ref cnt 
abcd john doe 123 2 
1234 martina  100 1 
123x brittany 123 2 
ab12 joe   101 1 

123已經出現了兩次,我想它顯示2 CNT柱等

+1

你正在使用什麼數據庫(MySQL,SQL-Server,Oracle等)? –

回答

0
select ID, Name, Ref, (select count(ID) from [table] where Ref = A.Ref) 
from [table] A 

編輯: 正如下面的評論中提到,這種方法可能不是最在所有情況下都是有效的,但在合理的小桌面上應該是足夠的。

在我的測試:

  • 的5460條記錄和976不同的「參考」值的表格在小於1秒的返回。
  • 包含600,831條記錄和8,335個不同'Ref'值的表,其中6秒內返回。
  • 一張包含845,218條記錄的表和15,147個不同的'Ref'值在13秒內返回。
+0

看看這篇關於如何[優化相關子查詢](https://en.wikipedia.org/wiki/Correlated_subquery#Optimizing_correlated_subqueries) – danihp

+0

@danihp有趣。如果我發現性能問題,請記住它,但不確定它是否值得讚揚? Original Post從來沒有暗示過桌子的大小。 FWIW在5,460條記錄和976個不同的'Ref'等價值表中,我在不到1秒的時間內得到了一個完整的結果集,對於包含8,335個不同的'Ref'等價值的600,831條記錄,我得到了6秒。 – user2585435

+0

有趣。從技術上講,我不能刪除downvote,除非你編輯你的答案。也許你可以在你的答案中包含這個數字與非相關查詢的數字。 – danihp

0

你應該提供SQL品牌知道的功能:

1)如果你的數據庫支持window functions

Select 
    *, 
    count(*) over (partition by ref) as cnt 
from your_table 

2)如果不是:

Select 
    T.*, G.cnt 
from 
    (select * from your_table) T inner join 
    (select count(*) as cnt from your_table group by ref) G 
    on T.ref = G.ref 
+0

非常感謝你的幫助 – Sandeep

0

您可以在下面使用COUNTOVER

QUERY

select ID, 
     Name, 
     ref, 
     count(ref) over (partition by ref) cnt 
from #t t 

樣本數據

create table #t 
(
ID NVARCHAR(400), 
Name NVARCHAR(400), 
Ref INT 
) 

insert into #t values  
('abcd','john doe', 123), 
('1234','martina',  100), 
('123x','brittany', 123), 
('ab12','joe',   101) 
+0

非常感謝你這麼快速的迴應 – Sandeep

+0

嘿,我怎樣才能接受它作爲正確的答案?可以指導,因爲我無法找到任何這樣的選項,這是我的第一個問題 – Sandeep