2012-07-26 23 views
10

Come faccio a implementare il 'significato' della seguente dichiarazione pseudo-SQL:TSQL 'Dove' Condizione

COUNT(distinct id where attribute1 > 0) 

In altre parole, come faccio a fare condizionali, le dichiarazioni di conteggio distinte?

Grazie!

risposta

27

Bene, se è possibile filtrare l'intera query, quindi LittleBobbyTables ha già the answer per voi. In caso contrario, è possibile ottenere tale colonna in questo modo:

count(distinct case when attribute1 > 0 then id end) -- implicit null-else, iirc 
+0

L'ho avuto bisogno come parte di una query. Cosa c'è di sbagliato nell'usarlo in una funzione aggregata? – CodeKingPlusPlus

+0

+1, e ti ricordi bene: quando 'ELSE' è omesso,' ELSE NULL' è implicito. Su una nota diversa, non capisco questa "preoccupazione di prestazione" per quanto riguarda l'aggregazione condizionale. Voglio dire, quali sono le alternative a 'CASE' in una funzione aggregata (ad esempio, quando la query deve restituire sia il conteggio condizionale che incondizionato)? –

+0

Vedo, ma l'hai già stabilito nella tua risposta, quindi la tua ultima affermazione suona come se qualcuno potesse essere infastidito da un * uso perfettamente legittimo * dell'aggregazione condizionale. Volevo solo chiarire se volevi davvero dirlo. E in generale, sono d'accordo con te sul fatto che questa cosa * possa * essere abusata, come qualsiasi altra cosa. –

2

È praticamente l'aveva:

SELECT COUNT(DISTINCT [ID]) AS DistinctID 
FROM YourTable 
WHERE attribute1 > 0