2012-11-11 46 views
0

嗨我想寫一個SQL語句,返回從同一個表,但具有不同的WHERE子句計數和計數(不同)。如何在同一個SQL中使用不同的WHERE編寫COUNT和DISTINCT?

例如

People 
----------------------- 
ID  Name  Sex 
1  Alex  F 
2  Alex  M 
3  Alex  M 
4  Andy  F 
5  Andy  M 
6  Ann   F 
7  Ann   F 

在這個例子中,我可以寫SELECT (SELECT COUNT(1) FROM People), (SELECT COUNT(DISTINCT Name) FROM People),但那只是太多的選擇。所以我寫SELECT COUNT(1), COUNT(DISTINCT Name) FROM People

但是如果我想返回類似SELECT (SELECT COUNT(1) FROM People), (SELECT COUNT(DISTINCT Name) FROM People WHERE Sex='M')的東西。你如何像上面一樣做少SELECT?

我不知道這是否是相關的,我知道我可以寫一些像SELECT COUNT(1), SUM(CASE WHEN Sex='M' THEN 1 ELSE 0 END) FROM People在一個SELECT中有不同的WHERE子句,但那只是COUNT,它不處理DISTINCT。當需要DISTINCT時,你如何使用它?

數據庫是SQL Server 2008 R2中,謝謝您

+2

您在查詢中發佈的樣本數據表'人名'的期望輸出是什麼? –

+0

我很想知道爲什麼你特別需要減少SELECT語句的數量?使用多個語句是否有性能問題? – Tony

回答

4

試試這個:

Select count(id), count(distinct case when sex = 'M' then name else null end) 
From people 

你可以看到它在SQL小提琴這裏:

+0

@MahmoudGamal真的很酷。謝謝。 – marvin

+0

這是可行的,因爲它計數不同的名稱,但當性別不是男性時名稱爲空,因此退出聚合表達式。 – marvin

+0

這太瘋狂了!超級酷的想法。謝謝! – user1589188

0

你需要顯示兩個分組操作的結果,所以union可以幫助您:

SELECT 'Full' AS 'Grouping Type', count(*) AS 'Count' FROM people 
UNION 
SELECT 'Men', count(DISTINCT name) FROM people WHERE sex = 'M' 
+0

是的,但是在這裏你不會將SELECT減少到一個,而是得到兩行而不是一行。 – marvin

+0

我知道,但沒有看到只顯示一行的要求。實際上沒有看到使用一行來處理這種數據的原因。 – udalmik

+0

我希望這是一行,因爲我想生成一個包含許多其他類似表(UNION)的報告。所以一行一列。 – user1589188

相關問題