これは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;
は、私はあなたが列の別名のための単一引用符を使用しないように助言する:一部のデータベースで
どのバージョンのMySQLですか? bugs.mysql.comで報告するバグのような匂いがする。 –
@RickJames MariaDB 10.2私は信じていますが(明日仕事をするまで確かめることはできません) – Svish