2017-03-03 13 views
0

Excelのような式を解析してsqlリクエストを生成しています。SUM(IF(COND、EXPR、NULL))とIF(COND、SUM(EXPR)、NULL)

だから与えられた式のために、私はこの要求を取得する:

SELECT IF(COL1='Y', SUM(EXPR),NULL) 
FROM Table 

私は私が望む結果を得ることはありません。私は手動で次のようにリクエストを書き換える場合、それは動作します:私はGROUP BYステートメントを追加した場合

SELECT SUM(IF(COL1='Y', EXPR, NULL)) 
FROM Table 

また、最初の要求がCOL1='Y'行のために、正しい値を生成します。

SELECT IF(COL1='Y', SUM(EXPR),NULL) 
FROM Table 
GROUP BY COL1 

方法はあります最初の構文をIF(COND, SUM(EXPR), NULL)のままにして、それをわずかに編集してGROUP BYの文がなくても動作するようにしますか?

+1

私はあなたが2番目のクエリで正しいロジックを見つけたと思います。これは正しい構文です(ただし 'if()'の代わりに 'case'を使用します)。 –

+0

@ GordonLinoff、そうですが、私はANTLR文法に触れてはいけないと思っています:(なぜGROUP BYを追加するとうまくいくのですか? – Amessihel

答えて

0

SUMを使用しているのでGROUP BYを使用する必要があります。そうしないと、SQLエンジンはどのようにしてその列を要約したいのか分からなくなります。読んで、

SELECT SUM(EXPR) 
FROM Table 
WHERE COL1='Y' 

をしかし、その後、あなたは、このような各列に別々のクエリを実行する必要があります:

代わりにあなただけのこのコラムをまとめることができ、パフォーマンス上の理由からお勧めできません。