2017-03-27 19 views
1

TL; DR

算術演算で集計結果を使用する方法はありますか?MySQLの集約型カラムに算術演算を適用するにはどうすればよいですか?

詳細

私は例えば、2つの集約列(SUM(..)COUNT(..))を取り、それらを一緒に操作したい:動作しません

-- doesn't work 
SELECT 
    SUM(x) AS x, 
    COUNT(y) AS y, 
    (x/y) AS x_per_y -- Problem HERE 
FROM 
    my_tab 
GROUP BY groupable_col; 

が、私はこれが行う見つけた:

しかし、私は集約で動作する多くの列が必要な場合、すぐに非常に反復的になります.MySQL集計を複数回計算しないように最適化することができます。

私は今しばらくの間、SO検索だけでなく、いくつかの長所を聞くと、私が思い付くことができる最高の選択肢は私のDBがサポートされていないネストされた選択、~~できました。~~

EDIT:(それサポートにそれらをした、私が何か間違ったことをやっていた、と途中で

をネストされた選択を除外はまた、MySQLのドキュメントは、それをサポートするようだが、私はこのような何かを動作させることはできませんリンク最下部の例)

https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html

+0

複数の回の集計を書くよりもオーバーヘッドが多い.AFAIK、mysql doenstは同じ操作を再度実行して、値がリサイクルされるようにする(クエリごとに) – Mihai

答えて

3

一つの方法は、サブクエリを使用している:

select x, 
    y, 
    x/y as x_per_y 
from (
    select SUM(x) as x, 
     COUNT(y) as y 
    from my_tab 
    group by groupable_col 
    ) t 

はまたcount(y)の値がゼロ(すべてのYがヌルである)ことが可能です。 MySQLはこのケースを自動的に処理し、分母がゼロの場合はNULLを生成します。

一部のDBMSは、通常、そのような場合にはnullを製造することにより処理され、この場合にはゼロエラーによって除算を投げる:あなたは計算値を格納するためにトリガーを使用することができますが、この場合、あなたはおそらく取得

select x, 
    y, 
    case when y > 0 then x/y end as x_per_y 
from (
    select SUM(x) as x, 
     COUNT(y) as y 
    from my_tab 
    group by groupable_col 
    ) t 
+0

MySqlは 'y'の' null'についてよく考えますが、 。したがって、あなたがここで見ることができるように、あなたの 'CASE'節は冗長です:http://rextester.com/GJKGP35737: – cars10m

関連する問題