SQL聚合查询问题

标签 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 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) 的行
  • 当 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 中测试的,但我希望它们也能在那里工作。

    关于SQL聚合查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845680/

    相关文章:

    java - 无法找到 Derby 数据库,如何在 Java 中连接

    jsp - JDBC Derby DriverManager.getConnection() 导致 SQLNonTransientConnectionException

    java - Derby - 如何处理目标字段的添加

    SQL 查询 - 在 UNION 中使用 Order By

    sql - 为什么 postgresql 规划器不使用索引扫描而不是在存储函数中显式排序?

    MySQL DATE_FORMAT 没有以正确的顺序输出日期

    database - 数据源 Derby - 连接被拒绝

    java - 如何将 Apache derby 嵌入到 Web 应用程序中

    sql - 基于多列生成ID

    MySQL,在除id之外的所有行中插入值