0

MySQL で前の値を使用して次の値を計算する方法は? 私の下手な英語では、私の意味をこれ以上明確に説明できませんでした (この投稿のタイトルを見て、私が尋ねたことを理解できる人はいますか?) ので、スニペットで説明させてください。


select
year_id,
sum(case when event_cd >= 20 then 1 else 0 end) as h,
sum(case when ab_fl = "T" then 1 else 0 end) as ab,
h/ab as ba
from events
group by year_id

上記のスニペットでは、クエリを実行すると、eventsテーブルにhまたはのような列がないため、エラーが発生しますab。ただし、前の構文で計算されるhandを使用したいと思います。それを可能にする方法がいくつかあったことは覚えていますが、方法も覚えていませんし、私が言ったように、英語が下手なため、私が求めているものに関連する投稿を見つけることができませんでした。この質問はすでにSOに投稿されていると確信しています。詳細な説明なしでリンクするだけでも非常に役立ちます。absum(case when ~)

ありがとう。

[アップデート]

答えてくれてありがとう。サブクエリを回避するために以前の値を使用したかったため、多くの冗長な入力が行われ、コード全体が読みやすくなりました。Mosty Mostacho で説明されているように、いずれかの方法 (サブクエリまたは別の値を計算するためだけに構文全体を 2 回記述する) を使用しましたが、MySQL でこれを使用するのが現実的でないかかなり危険な場合は、上記の 2 つの方法を確実に受け入れることができます。混乱させて申し訳ありません。

4

3 に答える 3

1

MySQL には 2 つの方法があります (ところで、クエリを少し単純化しましたが、それでも有効です)。

オプション #1: 変数を展開する

SELECT
  year_id,
  SUM(event_cd >= 20) h,
  SUM(ab_fl = "T") ab,
  SUM(event_cd >= 20) / SUM(ab_fl = "T") ba
FROM events
GROUP BY year_id

オプション #2: 派生テーブルを使用する

SELECT year_id, h, ab, h / ab ba FROM (
    SELECT
      year_id,
      SUM(event_cd >= 20) h,
      SUM(ab_fl = "T") ab
    FROM events
    GROUP BY year_id
) s

2 番目の方が速く実行されると考えたくなるかもしれませんが、そうではありません。最初のものは、派生テーブルを必要とせず、1 回のパスで問題を解決できるため、より高速に実行される可能性が最も高くなります。

于 2013-10-30T15:22:31.467 に答える
0

更新 @MostyMostacho が以下のコメントで説明しているように、ユーザー変数の評価順序が定義されていないため、これは推奨される手法ではありません。


合計を格納する構文を使用して MySQL 変数を使用してクエリを記述し@varname := 'value'、それを参照できます。

SELECT
  year_id
, @h := SUM(CASE WHEN event_cd >= 20 THEN 1 ELSE 0 END) AS h
, @ab := SUM(CASE WHEN ab_fl = "T" THEN 1 ELSE 0 END) AS ab
, @h/@ab AS ba
FROM events
GROUP BY year_id
于 2013-10-30T15:30:03.143 に答える
0

試す

select * h/ab as ba from 
(
select
year_id,
sum(case when event_cd >= 20 then 1 else 0 end) as h,
sum(case when ab_fl = "T" then 1 else 0 end) as ab,
from events
group by year_id)
source
于 2013-10-30T15:18:40.630 に答える