从一个表中的多个表中计数代码返回 0

Posted

技术标签:

【中文标题】从一个表中的多个表中计数代码返回 0【英文标题】:Counting codes from one table in multiple tables returning 0s 【发布时间】:2013-06-15 17:07:51 【问题描述】:

我是 SQL 和数据库的新手。我正在使用它们为学术论文编码数据(将相关信息标签分配给各种句子)。我环顾四周,但我对 SQL 的陌生可能让我错过了寻找答案的正确方法。

我有几个表,我想计算给定字段中每个表的所有代码实例。在 CODES 中,我有一系列可以根据需要更新的代码。其他表格具有使用代码填写的字段。

代码 ID GR SR CT 1秒 2个 3个 4秒 5 溶解氧 6 IO 7吨 8 我 数据1 ID IGR ISR ICT 1 S S T 2 点 3 S IO I 4秒我 数据2 ID IGR ISR ICT 1 个 2个 3 秒 4 点 预期成绩: CODES.GR DATA1.IGR DATA2.IGR 小号 3 0 一个 0 2 1 2

我已经尝试了以下代码:

SELECT "CODES"."CT",
COUNT ("IGR") AS "DATA1.IGR",
COUNT ("IGR") AS "DATA2.IGR"
FROM
"DATA1", "DATA2"
JOIN "CODES" ON "CODES"."GR" = "DATA1"."IGR"
JOIN "CODES" ON "CODES"."GR" = "DATA2"."IGR"
GROUP BY
"CODES"."GR"

这给了我每个表每个代码 1000 个结果,而我预计每个表每个代码少于 100 个。我尝试了不同的 JOIN 无济于事。

每列的代码数量超过 15-20 个。每当我添加代码时,SUM CASE WHEN 都不会更新,因此这些代码不太理想。如果有办法将查询联合在一起,则输出的格式不一定是一成不变的。理想的查询从 CODES.column 中提取所有代码,计算所有实例并在不使用时返回 0。我想跨 11 个表运行这个单一查询。

我正在使用运行 HSQL 数据库引擎的 OpenOffice Base。

感谢您的帮助

【问题讨论】:

【参考方案1】:

试试

SELECT c.GR, 
       COALESCE(a.IGR1, 0) IGR1,
       COALESCE(b.IGR2, 0) IGR2
  FROM codes c LEFT JOIN
(
  SELECT IGR, COUNT(*) IGR1
    FROM data1
   WHERE IGR IS NOT NULL
   GROUP BY IGR
) a ON c.GR = a.IGR LEFT JOIN
(
  SELECT IGR, COUNT(*) IGR2
    FROM data2
   WHERE IGR IS NOT NULL
   GROUP BY IGR
) b ON c.GR = b.IGR
 WHERE c.GR IS NOT NULL

SELECT c.GR,
       (SELECT COUNT(*) 
          FROM data1 
         WHERE IGR = c.GR) IGR1,
       (SELECT COUNT(*) 
          FROM data2 
         WHERE IGR = c.GR) IGR2
  FROM codes c
 WHERE c.GR IS NOT NULL

两个查询的输出:

|遗传资源 | IGR1 | IGR2 | -------------------- |小号 | 3 | 0 | |一个 | 0 | 2 | |磷 | 1 | 2 |

这里是 SQLFiddle 演示,用于 mysql 中的两个查询。它在 HSQLDB 上也应该可以正常工作。

【讨论】:

【参考方案2】:

这就是我在 Oracle 中的做法:

SELECT c.gr, d1.cnt, d2.cnt
  FROM codes c
  LEFT JOIN (SELECT igr, COUNT(*) cnt FROM data1 GROUP BY igr) d1 ON c.gr=d1.igr
  LEFT JOIN (SELECT igr, COUNT(*) cnt FROM data2 GROUP BY igr) d2 ON c.gr=d2.igr
;

虽然这会给出 null=blank 而不是 0。要解决这个问题,您可以这样做:

SELECT c.gr
     , CASE WHEN d1.cnt IS NULL THEN 0 ELSE d1.cnt END
     , CASE WHEN d2.cnt IS NULL THEN 0 ELSE d2.cnt END
  FROM codes c
  LEFT JOIN (SELECT igr, COUNT(*) cnt FROM data1 GROUP BY igr) d1 ON c.gr=d1.igr
  LEFT JOIN (SELECT igr, COUNT(*) cnt FROM data2 GROUP BY igr) d2 ON c.gr=d2.igr
;

【讨论】:

以上是关于从一个表中的多个表中计数代码返回 0的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中显示一个表中的所有行并从另一个表中计数

从 H2 数据库引擎中的表中计数条目

如何在 Slick 2.0 中计数(*)?

在 sqlalchemy 中计算子查询

无法更新表中的列 它返回单行子查询返回多个

使用 Athena / Presto 从多个表返回 SQL 数据,受 1 个表中的日期范围限制