2010-05-16 14 views
5

¿Alguien me puede ayudar con una consulta SQL en Apache Derby SQL para obtener un conteo "simple"?Pregunta de consulta agregada SQL

Dada una tabla ABC que tiene este aspecto ...

  
    id a b c 
    1 1 1 1 
    2 1 1 2 
    3 2 1 3 
    4 2 1 1 
** 5 2 1 2 ** 
** 6 2 2 1 ** 
    7 3 1 2 
    8 3 1 3 
    9 3 1 1 

¿Cómo puedo escribir una consulta para obtener un recuento de cómo puede distintos valores de 'a' tener ambas cosas (b = 1 y c = 2) AND (b = 2 y c = 1) para obtener el resultado correcto de 1. (las dos filas marcadas coinciden con los criterios y ambas tienen un valor de a = 2, solo hay 1 valor distinto de a en esta tabla que coincide con los criterios)

El truco es que (b=1 and c=2) AND (b=2 and c=1) son obviamente mutuamente excluyentes cuando se aplica a una sola fila. .. entonces, ¿cómo aplico esa expresión en varias filas de valores distintos para a?

Estas consultas están equivocados, pero para ilustrar lo que estoy tratando de hacer ...
SELECT DISTINCT COUNT(a) WHERE b=1 AND c=2 AND b=2 AND c=1 ...
.. (0) sin ir tan mutuamente excluyentes
SELECT DISTINCT COUNT(a) WHERE b=1 AND c=2 OR b=2 AND c=1 ...
.. (3) me pone mal resultado.
SELECT COUNT(a) (CASE WHEN b=1 AND c=10 THEN 1 END) FROM ABC WHERE b=2 AND c=1
.. (0) sin ir tan mutuamente excluyentes

Cheers, Phil.

+0

es (a, b, c) único? En otras palabras, ¿puede haber dos filas con diferentes identificadores pero con los mismos valores de a, byc? –

Respuesta

7

Supongo que (a, b, c) es único. Una forma de hacer esto es utilizar un auto de Ingreso:

SELECT COUNT(*) 
FROM ABC T1 
JOIN ABC T2 
ON  T1.a = T2.a 
WHERE T1.b = 1 AND T1.c = 2 
AND T2.b = 2 AND T2.c = 1 

Esto funciona conceptualmente de la siguiente manera:

  • Encuentra todas las filas que satisfacen (b,c) = (1,2)
  • Encuentra todas las filas que satisfacen (b,c) = (2,1)
  • Unir los dos conjuntos anteriores cuando a es el mismo.
  • Cuente el número de filas en el resultado unido.

Una forma alternativa que podría ser más fácil de entender es el uso de una subselección:

SELECT COUNT(*) 
FROM ABC 
WHERE a IN (SELECT a FROM ABC 
      WHERE b = 2 
      AND c = 1) 
AND b = 1 
AND c = 2 

Nota: si no puede haber valores de (a, b, c) a continuación, en lugar de SELECT COUNT(*) uso SELECT COUNT(DISTINCT T1.a) duplicados en la primera consulta, y SELECT COUNT(DISTINCT a) en el segundo.

Estas consultas se prueban en MySQL, no en Apache Derby, pero espero que también funcionen allí.

+0

Gracias a todos por las respuestas y especialmente a usted Marque la respuesta rápida y precisa. Probé tu segunda sugerencia y funcionó perfectamente. Ahora bien, porque en realidad estoy tratando de escribir un informe de tabla de referencias cruzadas Me pregunto si tengo que tener una consulta para cada combinación de valores de B y C o si de alguna manera puedo hacerlo todo en una sola consulta. Cheers, Phil. – Phil

0

El poco complicado es que (b = 1 y c = 2) y (b = 2 y c = 1) son, evidentemente, mutuamente excluyentes cuando se aplica a una sola fila

Exactamente así. Al pensar en el establecer de registros, desea el número de valores distintos "a" para las filas donde OR(b = 2 and c = 1).Prueba esto: segunda consulta

SELECT COUNT(DISTINCT a) FROM "abc" WHERE (b=1 OR c=2) OR (b=2 OR c=1) 
+0

debe ser 'AND' en la consulta final dentro del paréntesis .. –

1

de Mark de hecho debe ser apoyado por Apache Derby, de acuerdo con Apache Derby's SQL support page.

SELECT COUNT(DISTINCT a) FROM ABC 
WHERE b = 1 AND c = 2 
    AND a IN (SELECT a FROM ABC WHERE b = 2 AND c = 1); 

Además de ser fácil de leer que la versión auto-unirse, sino que también debe ser más rápido, ya que se evita la sobrecarga de tener que hacer un JOIN.