2016-07-26 3 views
2

MySQL의 ROLLUP 관련 문제가 발생하여 결과로 NULL을 처리했습니다. IFNULL/COALESCE 함수는 일반 열과 잘 작동하지만 날짜 함수와 함께 사용하면 분해됩니다. 예를 들면 다음과 같습니다롤업, coalesce/ifnull 및 날짜 함수가있는 MySQL 그룹

SELECT 
    YEAR(date_time) AS Year, 
    count(x) AS Count 
FROM mytable 
GROUP BY year WITH ROLLUP 

수익률 (예상대로)

Year Count 
---- ----- 
2015 3 
2016 2 
NULL 5 

내가 기능을 IFNULL를 사용하거나 COALESCE에 의해, 나는 NULL 값을 처리 할 수 ​​있습니다 (예를 들어, VARCHAR)이 아닌 날짜 열에 대한 쿼리 NULL 값을 문자열로 대체합니다. 그러나 위의 쿼리에 동일한 논리를 적용하면 작동하지 않는 것 같습니다.

Year Count 
---- ----- 
2015 3 
2016 2 
moo 5 

어떤 아이디어를 예상

SELECT 
    COALESCE(YEAR(date_time), 'moo') AS Year, 
    count(x) AS Count 
FROM mytable 
GROUP BY year WITH ROLLUP 

또는

SELECT 
    IFNULL(YEAR(date_time), 'moo') AS 'year', 
    count(x) AS Count 
FROM mytable 
GROUP BY year WITH ROLLUP 

반환

Year Count 
---- ----- 
2015 3 
2016 2 
NULL 5 

대신

, 제안?

+0

이 질문은 실제로 의미가 없습니다. 실제로 GROUP BY와 함께 사용되는 집계 함수가 없으므로 아무 것도 굴리지 않았기 때문입니다. –

+0

내 질문의 핵심에 도달하기 위해 최소한의 부담을 덜어 줬기 때문에 –

+0

대표 샘플을 제시해야합니다. 롤업이 없으므로 위의 내용을 이해할 수 없습니다. –

답변

1

NULL을 (전체 데이터 집합에서 NULL과 대조적으로) 집계 롤업 계산 중에 생성하려는 경우 잘못된 NULL을 참조합니다. 그렇다면, 이것은 당신이 무엇을하려고 아마도 :

SELECT 
    IFNULL(m.year, 'moo') 
FROM 
    (SELECT 
     YEAR(date_time) AS 'year' 
    FROM 
     mytable 
    GROUP BY 
     year 
    WITH ROLLUP) m 

가 여기에 sqlfiddle입니다.

+0

이것은 내 문제를 해결해줍니다. 내가 이해하지 못하는 이유는 같은 쿼리가 다른 유형의 열과 잘 작동한다는 것입니다. (예 : varchar의 경우이 작업은 매우 효과적입니다. 'SELECT COALESCE (category,'moo ') FROM 카테고리 GROUP BY 카테고리 WITH ROLLUP;) –

+0

차이점은 열 유형이 아니라 파생 된 그룹과 원시 값의 차이입니다. 위의 귀하의 의견에있는 "varchar 쿼리"에서, 당신은'category'에 의한 그룹화를하고, 당신의'SELECT'에서 파생 된 값을 그룹화하지는 않습니다. [this sqlfiddle] (http://sqlfiddle.com/#!9/378b70/7)을 참조하십시오. –

+0

원본 테이블에 NULL 값이있는 경우에 특히 내가 말하는 것을 보았습니다. 그러나 ROLLUP에 의해 생성 된 NULL에 대해 더 많이 언급했습니다. 또한 한 가지 이상의 문제가 있습니다. 이 [sqlfiddle] (http://sqlfiddle.com/#!9/7c794b/3)에서 4 쌍의 쿼리를 살펴보십시오. 첫 번째 두 쌍은 GROUP BY 열 이름 또는 생성 한 별칭에 관계없이 중요합니다. 열 유형에 관계없이 SELECT. 마지막 두 쌍은 GROUP BY 문 내에서 열 데이터를 기능적으로 조작해야하는 경우 COALESCE가 작동하지 않음을 보여줍니다 (유형에 관계없이) –