estoy usando SQL Server 2005. Con la consulta a continuación (simplificado de mi consulta real):conde valor nulo distinto y es eliminado por un agregado
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
¿Hay alguna manera de hacer un recuento distinta sin obteniendo
"Advertencia: el valor nulo es eliminado por un agregado u otra operación SET".
Estas son las alternativas que se me ocurren:
- ANSI_WARNINGS Desactivación de
La separación en dos consultas, una con recuento diferente y una cláusula where para eliminar los nulos, uno con la suma:
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
ignorar la advertencia en el cliente
¿Hay una mejor manera de hacerlo? Probablemente iré por la ruta 2, pero no me gusta la duplicación del código.
Creo que su código anterior está bien, la base de datos no debería molestarlo con sorpresas, por eso es una advertencia, porque algunos programadores pueden pensar que DISTINCT debería incluir el conteo de nulos de todos modos. Creo que la alerta de advertencia cumple con ANSI SQL. –
Tu explicación tiene sentido. Aún así, no me gustan las advertencias si puedo evitarlas. –