从一个表中的多个表中计数代码返回 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的主要内容,如果未能解决你的问题,请参考以下文章