2017-11-17 3 views
-1

これはHeidiSQLでは正常に動作しますが、厳密なモードのためにLaravelでは動作しません)ONLY_FULL_GROUP_BYが設定されているSQLモードのため、おそらく:「グループ化しない」フィールドなしで「SUM」をどのようにするかxはHAVING句で使用されます。

SELECT 
    project.id 
     'Project code', 
    SUM(report.hours) 
     'Total hours', 
    SUM(CASE WHEN report.date BETWEEN :report_start AND :report_end THEN report.hours END) 
     'Total report hours' 

FROM report 
    INNER JOIN project ON project.id = report.id 
WHERE report.date <= :report_end 

GROUP BY 
    project.id 

HAVING 
    `Total report hours` != 0 

それは私に次のエラーを与える:

Syntax error or access violation: 1463 Non-grouping field 'Total report hours' is used in HAVING clause

私はここの周り探してみたが、私は見つけるすべての質問に移動することで解決されますフィルタをHAVINGからWHEREにすることができますこれらのケースには実際に集約関数が含まれていないためです。しかし、私の場合、それはあります、そして、これはちょうどHAVINGのためだと思ったのですか?私。私は、報告された期間に時間がないすべての行を除外したいと思います。

私の代わりに、代わりにこのように、全体SUMを繰り返し、Total report hoursを参照することによってそれを「解決」することができます

HAVING 
    SUM(CASE WHEN report.date BETWEEN :report_start AND :report_end THEN report.hours END) != 0 

をしかし、それはすでに計算だときには、非常に不必要と汚い感じていると(私の視点からビュー)をクエリ自体の中で利用できます。

自分自身を繰り返すことなく、厳密なモードで動作する方法がありますか?

SELECT p.id as 'Project code', 
     SUM(r.hours) as 'Total hours', 
     SUM(CASE WHEN r.date BETWEEN :report_start AND :report_end THEN r.hours END) as 'Total report hours' 
FROM report r INNER JOIN 
    project p 
    ON p.id = r.id 
WHERE r.date <= :report_end 
GROUP BY p.id 
HAVING SUM(CASE WHEN r.date BETWEEN :report_start AND :report_end THEN r.hours END) <> 0; 

は、私はあなたが列の別名のための単一引用符を使用しないように助言する:一部のデータベースで

+0

どのバージョンのMySQLですか? bugs.mysql.comで報告するバグのような匂いがする。 –

+0

@RickJames MariaDB 10.2私は信じていますが(明日仕事をするまで確かめることはできません) – Svish

答えて

0

は、あなたは集約式をコピーする必要があります。複数のデータベースを使用しているため、どのエスケープ文字がベストであるかは不明です。バッククォート、二重引用符、または角カッコです。

もちろん、サブクエリを使用することもできます。

+0

ええ、集計式をコピーするのは、回避策として行ったことです。うまくいけば、汚いです。あなたは一重引用符を使用しないということはどういう意味ですか? 1人は何を使うべきですか? – Svish

+0

@Svish。 。 。 MariaDBでは、バックティックを使用します。 –

+0

なぜですか?そうでない場合はどうなりますか? – Svish

0

派生テーブルにクエリをラップします。トップレベルの条件を追加してください:

select * 
from 
(
SELECT 
    project.id 
     'Project code', 
    SUM(report.hours) 
     'Total hours', 
    SUM(CASE WHEN report.date BETWEEN :report_start AND :report_end THEN report.hours END) 
     'Total report hours' 

FROM report 
    INNER JOIN project ON project.id = report.id 
WHERE report.date <= :report_end 

GROUP BY 
    project.id 
) dt 
WHERE `Total report hours` != 0 
+0

Hm ...これを行うと、実際には同じエラーが発生します。*グループ化されていないフィールド 'Total report hours'はHAVING句で使用されます。* ...にもHAVING句がありません実際のクエリの実行... – Svish

+0

バグのように見えます。 – jarlh

関連する問題