2017-11-17 21 views
-1

그래서이 쿼리는 HeidiSQL에서 제대로 실행되지만 Laravel에서는 엄격한 모드 (및보다 구체적으로 아마 때문에 ONLY_FULL_GROUP_BY가 설정되는 SQL 모드)의 :"그룹화하지 않는 필드없이"SUM을 HAVING하는 방법 "HAVING 절에 x가 사용되었습니다."

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

그래, 응집 표현을 복사하는 것이 내가 해결 방법으로 한 일이다. 작동하지만 지저분한. 그래도 작은 따옴표를 사용하지 않는 것에 대해 무엇을 의미합니까? 무엇을 사용해야합니까? – Svish

+0

@Svish. . . MariaDB에서는 backticks를 사용하십시오. –

+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

흠 ... 내가이 일을 할 때 실제로 같은 오류가 발생합니다. * 그룹화되지 않은 필드 '총 보고서 시간'은 HAVING 절에 사용됩니다. * ...에도 HAVING 절이 없지만 실제 쿼리 실행 ... – Svish

+0

버그처럼 보입니다. – jarlh