0

私はMySQLデータベースを使用しており、この1行を除いて完全に正常に機能する大きなmysql_queryがあります。

SELECT game_id, 
COALESCE(
SUM(CASE WHEN game_score = 1 THEN 1 ELSE 0 END) 
- 
SUM(CASE WHEN game_score = 0 THEN 1 ELSE 0 END), 0) AS score 
FROM .... 
WHERE .... 
GROUP BY ....

COALESCEこの行は、必要なほとんどすべての数値を返しますが、関数を使用していなかったときと同じ数値です。game_score`フィールド
がある場合、このステートメントで0を返したいと思います。 私のコードはどこで間違っていますか? game_id that has an empty

4

5 に答える 5

2

このようなデコード機能を使用することもできます---

SELECT game_id, 
SUM(DECODE(game_score, null, 0, 0, -1, 1, 0)) AS score 
FROM .... 
WHERE .... 
GROUP BY ....

このクエリが機能するかどうかを確認しまし
た。お役に立てば幸いです。

于 2012-05-24T04:56:18.830 に答える
1

追加

when game_score is null then ...

編集

SELECT game_id, case when game_score is null then 0 else
                SUM(CASE WHEN game_score = 1 THEN 1 ELSE 0 END) 
                -
                SUM(CASE WHEN game_score = 0 THEN 1 ELSE 0 END) end AS score 
FROM games
group by ...

このSQLFiddleの例を参照してください

于 2012-05-23T20:13:39.187 に答える
0

is nullのように使用

CASE WHEN game_score = 1 THEN 1 
when game_score is null THEN 0
ELSE 0 END
于 2012-05-23T20:16:04.163 に答える
0

SUM関数を囲む代わりに、ステートメントのフィールド名の周りにCOALESCE関数を使用します。

SUM(CASE COALESCE(game_score,0) WHEN 1 THEN 1 ELSE 0 END) - SUM(CASE COALESCE(game_score,0) WHEN 0 THEN 1 ELSE 0 END) 
于 2012-05-23T20:24:25.087 に答える
0

問題は、game_idの1つの行に空のgame_scoreフィールドがあり、別の行に有効なフィールドがある可能性があることです。コードは有効なコードを取得し、null以外を返します。

合体する最初の引数として、このケースを明示的に探すことで、この問題を修正します。SELECT game_id、(CASE WHEN count(*)<> count(game_score)then NULL ELSE COALESCE(SUM(CASE WHEN game_score = 1 THEN 1 ELSE 0 END )、...。

合体が何をしようとしているのかわかりません。さまざまなgame_scoresに1つ追加しているようです。代わりに次のいずれかを使用できますか?

COUNT(game_score) ?

SUM(case when game_score between 1 and xx then 1 else 0 end) ?
于 2012-05-23T20:24:55.867 に答える