0

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

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

代码
ID GR SR CT
1秒
2个
3个
4秒
5 溶解氧
6 IO
7吨
8 我
数据1
ID IGR ISR ICT
1 不锈钢
2 点
3 S IO I
4秒我
数据2
ID IGR ISR ICT
1 AST
2 AST
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。

谢谢你的帮助

4

2 回答 2

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 |

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

于 2013-06-15T21:37:08.303 回答
0

这就是我在 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
;
于 2013-06-15T19:31:05.743 回答