J'utilise SQL Server 2005. Avec la requête ci-dessous (simplifiée de ma requête réelle):Nombre valeur distincte et nul est éliminé par un agrégat
select a,count(distinct b),sum(a) from
(select 1 a,1 b union all
select 2,2 union all
select 2,null union all
select 3,3 union all
select 3,null union all
select 3,null) a
group by a
Est-il possible de faire un compte distinct sans "
" Avertissement: La valeur nulle est éliminée par un agrégat ou une autre opération SET. "
Voici les alternatives que je peux penser:
- Turning ANSI_WARNINGS hors
La séparation en deux requêtes, l'un avec compte distinct et une clause where pour éliminer les valeurs nulles, l'une avec la somme:
select t1.a, t1.countdistinctb, t2.suma from ( select a,count(distinct b) countdistinctb from ( select 1 a,1 b union all select 2,2 union all select 2,null union all select 3,3 union all select 3,null union all select 3,null ) a where a.b is not null group by a ) t1 left join ( select a,sum(a) suma from ( select 1 a,1 b union all select 2,2 union all select 2,null union all select 3,3 union all select 3,null union all select 3,null ) a group by a ) t2 on t1.a=t2.a
ignorer l'avertissement dans le client
Y a-t-il une meilleure façon de faire cela? Je vais probablement descendre la route 2, mais n'aime pas la duplication du code.
Je pense que votre ancien code est très bien, la base de données ne devrait pas vous déranger avec des surprises, c'est pourquoi il déclenche un avertissement, car certains programmeurs pourraient penser que DISTINCT devrait inclure le comptage des NULL. Je pense que cette alerte est conforme à ANSI SQL. –
Votre explication a du sens. Pourtant, je n'aime pas les avertissements si je peux les éviter. –