有没有办法在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方法。
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
不确定我还有什么比这更惯用的。您的查询似乎完全没问题。无论替代品是什么,它至少会更加冗长,而不一定更清晰。 (我的意思是,它可能与您的查询一样清晰和惯用)。
但如果你坚持,这里有一个可能的变化:
SELECT a.cnt / b.cnt AS ratio
FROM
(SELECT COUNT(*) FROM a) a (cnt),
(SELECT COUNT(*) FROM b) b (cnt)
但可能有一个问题。您将整数除以整数。在这种情况下,某些数据库服务器会执行整数除法,这可能会带来意外结果。例如,90 / 100
会产生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;