2010-01-06 70 views
6

我看到像什麼是COUNT(*)%2 = 1

select * 
from Table1 
group by Step 
having count(*) % 2 = 1 

查詢什麼絕招約having count(*) % 2 = 1

任何人都可以解釋一下嗎?

編輯:什麼是常用的使用領域?

+4

什麼DB這是什麼?下面的答案是真實的,但是,我很驚訝它在GROUP BY中使用SELECT *運行。這在MS SqlServer中不起作用,因爲您不能選擇任何未分組或聚合的任何內容。 – 2010-01-06 14:08:37

+1

@Robin日:我知道這將運行的唯一方法是如果'Table1'中的唯一一列是'步驟' – 2010-01-06 14:14:13

+0

這是Sql Server – 2010-01-06 14:16:40

回答

21

Well是模運算符,它給出了一個除法的餘數,因此當該數字能夠被2(偶數)整除時,它將給出0,如果不是(例如它是奇數)則爲1。因此,查詢基本上選擇計數爲奇數的元素(如上所述)。

+0

好的,我明白什麼是模塊操作符。但我不是這樣問的! 什麼是訣竅,爲什麼程序員使用這個語句,這背後的模式是什麼?等等。 – 2010-01-06 14:16:02

+1

訣竅在於選擇其他元素(具體的賠率) - 這是一個簡單的方法。如果你想更多地瞭解他們爲什麼要這樣做,這可能取決於上下文(例如,他們究竟選擇了什麼?)。 – ternaryOperator 2010-01-06 14:23:01

+1

假設你想把奇數和偶數分爲兩列。你可以使用其中的一個,另一個使用奇數。這有幫助嗎? – Hazior 2010-01-06 14:23:34

15

如果您每步都有奇數的條目,是不會檢查的?

4

它將返回奇數行的所有步驟。

1

COUNT(*)將統計數據庫中的所有行。 %是模數字符,它會給你一個除法問題的其餘部分。因此,這將所有行分爲兩部分,並返回剩餘爲1的部分(意思是奇數行)。

正如Erik指出的那樣,這不是所有行,而是按步驟分組的那些行,這意味着每一步都是奇數行。

+0

它會對行進行計數,按步驟分組。 – erikkallen 2010-01-06 14:25:38

+0

謝謝,我沒有注意到GROUP BY步驟。 – 2010-01-06 14:28:52

1

一個理由這樣做:

說你要到奇數和偶數項獨立成兩列。你可以使用其中的一個,另一個使用奇數。

我也把這個在評論中,但沒有得到迴應。

+0

是的,你是對的...這可能是一個原因。 – 2010-01-06 15:30:59

1

我們不可能在不知道表格用於什麼的情況下回答您的問題。

對於給定的「步驟」,可能是因爲它需要有「東西」等量,而這將產生元素的列表顯示在一些界面,這是情況並非如此。

例如: 讓我們暫時忘記「步驟」,並假設這是一張學生表格,而「步驟」代替了學生分配的「團體」。對一個小組的要求是,偶數的學生,因爲學生將成對工作。對於管理工具,您可以編寫像這樣的查詢來查看不正確的組列表。

組:計數 A,10 B,9 C,17 d,8 E,4 樓5

而且該查詢將返回組B,C,F

0

感謝大家。你們所有人都說查詢返回有奇數的分組行。

但這不點!我會繼續檢查將這種情況下,寫在程序員的頭腦的原因(如果我找到誰寫這篇文章)

教訓:程序員必須寫這樣的愚蠢邏輯的意見...

+1

我不認爲這個邏輯是錯誤的,它只是非常糟糕的編碼。如果開發人員使用步驟代替*代碼將是自我解釋,並不需要評論,請參閱我的答案的詳細信息 – kristof 2010-01-06 15:10:40

2

只是測試它

declare @t1 table (step char(1)) 
insert into @t1(step) 
select 'a' 
union all select 'b' 
union all select 'b' 
union all select 'c' 
union all select 'c' 
union all select 'c' 
union all select 'd' 
union all select 'd' 
union all select 'd' 
union all select 'd' 


select * from @t1 
group by step 
having count(*)%2 = 1 

將返回存在添加列步驟值在這個例子中多次

號將返回

'a' 
'c' 

select *這裏雖然混亂我寧願把它寫成

select step from @t1 
group by step 
having count(*)%2 = 1 

或者甚至更多的知名度

select step, count(*) from @t1 
group by step 
having count(*)%2 = 1 
+1

感謝您的詳細示例... – 2010-01-06 15:29:31

+0

歡迎您,我必須承認,當我第一次看到我的代碼不知道發生了什麼,這是因爲使用「select *」 – kristof 2010-01-06 15:33:27

相關問題