任何人都可以帮助我在 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 and c=2) AND (b=2 and c=1) 以获得 1 的正确结果。(标记的两行符合条件并且都具有 a=2 的值,此表中只有 1 个不同的 a 值符合条件)
棘手的一点是 (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) 不互斥
干杯,
菲尔。
最佳答案
我假设 (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)
的行另一种更容易理解的方法是使用子选择:
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 中测试的,但我希望它们也能在那里工作。
关于SQL聚合查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845680/