SQL聚合查询问题

Phi*_*hil 5 sql derby

任何人都可以帮助我在Apache Derby SQL中使用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

如何编写一个查询来计算'a'的不同值如何同时具有(b = 1和c = 2)AND(b = 2和c = 1)以得到1的正确结果.标记的两行与条件匹配,并且两者的值都为a = 2,此表中只有1个不同的a值与条件匹配)

棘手的一点是,(b=1 and c=2) AND (b=2 and c=1)当应用于单行时显然是互斥的...那么如何将该表达式应用于多行不同的值?

这些查询是错误的,但为了说明我正在尝试做什么...
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)不要互相排斥

干杯,菲尔.

Mar*_*ers 7

我假设(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
Run Code Online (Sandbox Code Playgroud)

这在概念上如下工作:

  • 找到满足的所有行 (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
Run Code Online (Sandbox Code Playgroud)

注意:如果可以存在(a,b,c)的重复值,则SELECT COUNT(*)可以SELECT COUNT(DISTINCT T1.a)在第一个查询中使用,而不是在第二个查询中使用SELECT COUNT(DISTINCT a).

这些查询是在MySQL中测试的,而不是Apache Derby,但我希望它们也可以在那里工作.