2009-07-22 17 views
8

A continuación se muestra una consulta SQL que escribí para encontrar el número total de filas por cada identificador de producto (id_procedimiento):Conde SQL (*) y el Grupo By - Encuentra diferencia entre filas

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
ORDER BY proc_id; 

a continuación es el resultado de la consulta SQL arriba:

 
proc_id count(*) 
01 626 
02 624 
03 626 
04 624 
05 622 
06 624 
07 624 
09 624

Aviso los recuentos totales por id_procedimiento = '01', id_procedimiento = '03', y id_procedimiento = '05' son diferentes (no igual a 624 filas como el otro id_procedimiento).

¿Cómo escribo una consulta SQL para encontrar qué filas de proc_id son diferentes para proc_id = '01', proc_id = '03' y proc_id = '05' en comparación con el otro proc_id?

+0

Si entiendo su pregunta correctamente, necesitamos más información acerca de la estructura del resto de la tabla para producir cualquier cosa que tenga sentido. – Thorarin

Respuesta

2

Si conoces a 624 es el número mágico:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> 624 
ORDER BY proc_id; 
14

En primer lugar es necesario definir los criterios que hacen de '624' correcta. ¿Es el promedio count(*)? ¿Es el count(*) lo que ocurre más a menudo? ¿Es tu favorito count(*)?

continuación, puede utilizar la cláusula HAVING para separar los que no coinciden con su búsqueda:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> 624 
ORDER BY proc_id; 

o:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> (
    <insert here a subquery that produces the magic '624'> 
) 
ORDER BY proc_id; 
+3

+1 debido a la subconsulta –

0

intente esto:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> (select count(*) from proc z where proc_id in (1) group by proc_id) 
ORDER BY proc_id; 
0

Usted no puedo hacer esto Para algunos procesos hay menos filas con ese ProcId. En otras palabras, las filas que hacen que ese proceso no tenga un recuento = 624 son filas que NO EXISTEN. ¿Cómo puede una consulta mostrar esas filas?

Para los ProcIds que tienen demasiadas filas, IF (y esto es grande si), SI todas las filas en el 624 para otros procesos tienen algún atributo que es en común con un subconjunto de 624 count de los conjuntos que también son grande, entonces es posible que pueda identificar las filas "adicionales", pero no hay forma de identificar las filas faltantes, todo lo que puede hacer es identificar qué procesos tienen demasiadas filas o muy pocos ...

0

Si entiendo su pregunta correctamente (que es diferente de las otras respuestas publicadas) ¿desea las filas que hacen que proc_id 01 sea diferente? Si ese es el caso, debe unirse a todas las columnas que deberían ser iguales y buscar las diferencias. Por lo tanto, para comparar 01 con 02:

SELECT [01].* 
FROM (
    SELECT * FROM proc 
    WHERE grouping_primary = 'SLB' 
    AND eff_date = '01-JUL-09' 
    AND proc_id = '01' 
) as [01] 
FULL JOIN (
    SELECT * FROM proc 
    WHERE grouping_primary = 'SLB' 
    AND eff_date = '01-JUL-09' 
    AND proc_id = '02' 
) as [02] ON 
    [01].col1 = [02].col1 
    AND [01].col2 = [02].col2 
    AND [01].col3 = [02].col3 
    /* etc...just don't include proc_id */ 
WHERE 
    [01].proc_id IS NULL --no match in [02] 
    OR [02].proc_id IS NULL --no match in [01] 

estoy bastante seguro de MS SQL Server tiene una función de fila hash que puede hacer que sea más fácil si usted tiene un montón de columnas ... pero no puedo pensar en el nombre de eso

+0

excepto que, según entiendo la pregunta, no son los valores de columna los que la hacen diferente, sino simplemente el recuento de filas con ese proceso ... independientemente de los valores de columna - –

+0

CHECKSUM es el función hash de fila mágica –

0

Bueno, para encontrar el extra, utilizaría la frase NOT IN. Para encontrar las filas faltantes necesitaría invertir la lógica. Naturalmente, esto supone que las 624 filas son las mismas desde proc_id a proc_id.

SELECT proc_id, varying_column 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
AND varying_column NOT IN (SELECT b.varying_column 
          FROM proc b 
          WHERE b.grouping_primary = 'SLB' 
          AND b.eff_date = '01-JUL-09' 
          AND b.proc_id = (SELECT FIRST a.proc_id 
               FROM proc a 
               WHERE a.grouping_primary = 'SLB' 
               AND a.eff_date = '01-JUL-09' 
               AND COUNT(a.*) = 624 
               GROUP BY a.proc_id 
               ORDER BY a.proc_id;)) 
ORDER BY proc_id, varying_column; 
Cuestiones relacionadas