この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の方法があるかどうか疑問に思っています。
現在、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
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
それよりも慣用的なものが何であるかわかりません。クエリは完全に問題ないようです。置き換えが何であれ、それは少なくともより口頭であり、必ずしもより明確であるとは限りません。(つまり、クエリと同じくらい明確で慣用的なものになる可能性があります)。
しかし、あなたが主張するなら、ここに可能なバリエーションがあります:
SELECT a.cnt / b.cnt AS ratio
FROM
(SELECT COUNT(*) FROM a) a (cnt),
(SELECT COUNT(*) FROM b) b (cnt)
ただし、1つの問題がある可能性があります。あなたは整数を整数で割っています。一部のデータベースサーバーは、このような場合に整数除算を実行するため、予期しない結果が生じる可能性があります。たとえば、90 / 100
はを生成0
します2000 / 1001
が、結果は。になり1
ます。
この問題に対処するには、整数以外の数値で除算を実行する必要があります。結果をより適切にするには、オペランドの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;