Вопрос об агрегатном запросе SQL

Может любой помогать мне с SQL-запросом в Derby Apache SQL получить "простое" количество.

Учитывая таблицу ABC, которая похожа на это...

    
    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

Как я могу записать запрос для получения количества того, как может отличные значения и (b=1 и c=2) И (b=2 и c=1) для получения корректного результата 1. (эти две строки отметили, соответствуют критериям, и у обоих есть значение a=2, существует только 1 отличное значение в этой таблице, которые соответствуют критериям),

Хитрый бит - это (b=1 and c=2) AND (b=2 and c=1) являются очевидно взаимоисключающими при применении к одной строке... таким образом, как я применяю то выражение через несколько строк отличных значений для a?

Эти запросы являются неправильными, но проиллюстрировать то, что я пытаюсь сделать...
SELECT DISTINCT COUNT(a) WHERE b=1 AND c=2 AND b=2 AND c=1 ...
.. (0) никакие не идут как взаимоисключающие
SELECT DISTINCT COUNT(a) WHERE b=1 AND c=2 OR b=2 AND c=1 ...
.. (3) получает меня неправильный результат.
SELECT COUNT(a) (CASE WHEN b=1 AND c=10 THEN 1 END) FROM ABC WHERE b=2 AND c=1
.. (0) никакие не идут как взаимоисключающие

С наилучшими пожеланиями, Phil.

5
задан Gabriele Petrioli 17 May 2010 в 08:27
поделиться

3 ответа

Я предполагаю, что (a, b, c) уникален.Один из способов сделать это - использовать самосоединение:

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

Концептуально это работает следующим образом:

  • Найти все строки, удовлетворяющие (b, c) = (1,2)
  • Найти все строки, удовлетворяющие (b, c) = (2,1)
  • Соедините два вышеупомянутых набора, когда a совпадает.
  • Подсчитайте количество строк в объединенном результате.

Альтернативный способ, который может быть проще для понимания, - использовать подзапрос:

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

Примечание: если могут быть дублированные значения (a, b, c), то вместо SELECT COUNT (*) используйте SELECT COUNT (DISTINCT T1.a) в первом запросе и SELECT COUNT (DISTINCT a) во втором.

Эти запросы тестируются в MySQL, а не в Apache Derby, но я надеюсь, что они там тоже будут работать.

7
ответ дан 14 December 2019 в 04:32
поделиться

Сложность заключается в том, что (b = 1 и c = 2) AND (b = 2 и c = 1), очевидно, являются взаимоисключающими при применении к однорядный

Именно так. Когда вы думаете о наборе записей, вам нужно количество различных значений «a» для строк, где (b = 1 и c = 2) OR (b = 2 и c = 1) . Попробуйте следующее:

SELECT COUNT(DISTINCT a) FROM "abc" WHERE (b=1 OR c=2) OR (b=2 OR c=1)
0
ответ дан 14 December 2019 в 04:32
поделиться

Второй запрос Марка действительно должен поддерживаться Apache Derby, согласно странице поддержки SQL Apache Derby .

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);

Помимо того, что ее легче читать, чем версию с самосоединением, она также должна быть быстрее, так как вы избегаете накладных расходов, связанных с выполнением JOIN.

1
ответ дан 14 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: