0

有没有办法用 SQL 编写这个 SQL 查询?

select (select count(*) from a) / (select count(*) from b) as ratio;

我做了很明显的事情:

DB.fetch("select (select count(*) from a) / (select count(*) from b) as ratio")

但我想知道是否有更惯用的 SQL 方式来执行此操作。

4

3 回答 3

2

目前,Sequel::Dataset 不能使用其他 Sequel::Expression 子类可以使用的所有方法,尽管它可能至少应该能够处理其中的一些。您可以使用 Sequel 附带的 sql_expr 扩展来处理此问题:

Sequel.extension :sql_expr
DB.select((DB[:a].select{count(:*){}}.sql_expr /
  DB[:b].select{count(:*){}}).as(:ratio))
# SELECT ((SELECT count(*) FROM a) /
#   (SELECT count(*) FROM b)) AS ratio
于 2011-06-01T17:43:40.340 回答
1
Declare @A int = (select count(*) from a);
Declare @B int = (select count(*) from b);

select convert(decimal(15,3), @A) / convert(decimal(15,3), @B) as Ratio
于 2011-06-01T03:25:38.783 回答
0

不知道还有什么比这更惯用的。你的查询似乎很好。无论替换是什么,它至少会更冗长,而且不一定更清晰。(我的意思是,它可能与您的查询一样清晰和惯用)。

但如果你坚持,这里有一个可能的变化:

SELECT a.cnt / b.cnt AS ratio
FROM
  (SELECT COUNT(*) FROM a) a (cnt),
  (SELECT COUNT(*) FROM b) b (cnt)

不过,可能有一个问题。您正在将整数除以整数。某些数据库服务器在这种情况下会执行整数除法,这可能会给您带来意想不到的结果。例如,90 / 100将 yield 0,而2000 / 1001将导致1

要解决此问题,您需要对非整数数字执行除法。只需将其中一个操作数转换为非整数数字类型就足以使结果更合理。您可以使用显式转换,就像@hamlin11演示的那样,或者您可以像这样隐式转换:

SELECT a.cnt * 1.0 / b.cnt AS ratio
FROM
  (SELECT COUNT(*) FROM a) a (cnt),
  (SELECT COUNT(*) FROM b) b (cnt)

或者,直接应用于您的脚本:

select (select count(*) from a) * 1.0 / (select count(*) from b) as ratio;
于 2011-06-01T05:33:49.167 回答