2012-01-19 9 views
5

Tengo una lista de los valores de la siguiente manera:incorporarse a un tablero con una lista

("UXT8","U61J","U61W","U62U","X82U","U5NF","U635","U526","28FX") 

Me gustaría ser capaz de extraer de una mesa cuántas veces cada uno de ellos tiene lugar en un campo de una tabla , aun cuando el número de ocurrencias es 0.

lo que busco es similar a

select key_field, count(*) from table 
where key_field in ("UXT8","U61J","U61W","U62U","X82U","U5NF","U635","U526","28FX") 
group by key_field; 

pero con una especie de efecto de la izquierda unirse.

¿Es esto posible en sql, y específicamente en sus variantes sqlite o mysql?

Gracias

+0

¿Ha intentado ejecutar su consulta? ¿Cuál fue el resultado? –

+0

He ejecutado el equivalente para mi base de datos (campos y valores han sido cambiados en la publicación) y funciona, pero cuando un valor en la lista nunca aparece en la tabla, no obtengo ningún resultado para ese valor y quiero mostrar es decir: "U5NF", 0 – simone

+0

su consulta no podrá dar el '0' ya que el criterio de selección de consulta es si está presente. El cero que tendrás que obtener a través de otra lógica. – Nanda

Respuesta

2

Yo usaría un sindicato para construir una tabla de memoria en lugar de la lista:

select t.code, count(mytable.unique_id) from 
    (
    select 'UXT8' as code union 
    select 'U61J' as code union 
    select 'U61W' as code union 
    select 'U62U' as code union 
    select 'X82U' as code union 
    select 'U5NF' as code union 
    select 'U635' as code union 
    select 'U526' as code union 
    select '28FX' as code 
) as t 
left outer join mytable on t.code = mytable.key_field 
group by t.code 
order by t.code; 
+0

Realmente he probado esto en mi base de datos. Funciona correctamente (por supuesto, con nombres de tabla y valores ligeramente diferentes). La derecha se uniría da un resultado incorrecto ya que también muestra valores irrelevantes de 'mytable'. – DRCB

+0

sí, lo siento, ¡leí mal la pregunta! – newtover

1

esa consulta sólo fracasa porque no por lo que las teclas con 0, ya que no existen.

lo tanto, hacer esto:

create table #temptable(
    key_field varchar(4) 
) 

insert into #temptable values ("UXT8"), ("U61J"), ("U61W"), ("U62U"), ("X82U"), ("U5NF"), ("U635"), ("U526"), ("28FX") 

y epílogos ello seleccione:

select a.key_field, case when b.counter is null then 0 else b.counter end as counter from #temptable a 
left outer join 
(select key_field, count(*) counter from table 
where key_field in ("UXT8","U61J","U61W","U62U","X82U","U5NF","U635","U526","28FX") 
group by key_field) b on a.key_field = b.keyfield 
0

No, no se puede hacer esto en SQL, excepto, en los dialectos que soportan tablas derivadas, por utilizando un enfoque muy feo que implica una unión de n selecciona de la forma "seleccionar" utx8 '. Una alternativa más viable sería insertar esos valores en una tabla temporal y unirlos a eso.

0

utilizar simplemente un not in para averiguar las key_fields que no coinciden con ningún valor de la lista dada.

select key_field, count(*) as counter 
    from table 
where key_field in ('UXT8','U61J','U61W','U62U','X82U','U5NF','U635','U526','28FX') 
group by key_field 

union all 

select key_field, 0 as counter 
    from table 
where key_field not in ('UXT8','U61J','U61W','U62U','X82U','U5NF','U635','U526','28FX') 
group by key_field; 

Sólo tiene que hacer una union con una segunda consulta que se parece a la primera pero con not in operador y el cero del contador.

+0

esto no da lo que OP quiere – newtover

+0

@newtover ¿Puede explicarme por qué no da lo que quiere el OP? –

+0

porque enumera todos los campos_claves de 'tabla' con algunos recuentos en lugar de key_fields dentro de la lista IN con sus recuentos. – newtover

0
SELECT key_field, COALESCE(cnt, 0) as cnt 
FROM (
    SELECT 'UXT8' AS key_field UNION ALL 
    SELECT 'U61J' AS key_field UNION ALL 
    SELECT 'U61W' AS key_field UNION ALL 
    SELECT 'U62U' AS key_field UNION ALL 
    SELECT 'X82U' AS key_field UNION ALL 
    SELECT 'U5NF' AS key_field UNION ALL 
    SELECT 'U635' AS key_field UNION ALL 
    SELECT 'U526' AS key_field UNION ALL 
    SELECT '28FX'  
) as f 
LEFT JOIN (
    SELECT key_field, count(*) as cnt 
    FROM thetable 
    WHERE key_field IN ("UXT8","U61J","U61W", 
         "U62U","X82U","U5NF", 
         "U635","U526","28FX") 
    GROUP BY key_field) as cnts 
USING (key_field); 
Cuestiones relacionadas