2016-07-26 20 views
2

私はMySQLのROLLUPに関する問題に遭遇し、結果のNULLを扱っています。 IFNULL/COALESCE関数は単純な列ではうまく機能しますが、日付関数で使用すると分解されるようです。例としては、次のとおりです。私は非日付列(例えばVARCHAR)を照会する場合、私はIFNULLを使用してNULL値を扱う、または機能を結合することができるロールアップ、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 

をNULL値を文字列で置き換えます。しかし、上記のクエリに同じロジックを適用すると、動作しないようです。

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 
moo 5 

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(カテゴリ、 'moo')FROMカテゴリGROUP BYカテゴリWITH ROLLUP;) –

+0

違いはカラムのタイプではなく、派生によるグループ化と生の値の違いです。上のあなたのコメントの "varcharクエリ"では、 'SELECT'の派生値ではなく' category'でグループ化しています。 [this sqlfiddle](http://sqlfiddle.com/#!9/378b70/7)を参照してください。 –

+0

私は、あなたが言っていることを見ていると思います。特に元のテーブルのNULL値の場合は特にそうですが、私はROLLUPによって生成されたNULLをさらに参考にしていました。また、複数の問題があります。この[sqlfiddle](http://sqlfiddle.com/#!9/7c794b/3)の4組のクエリを見てください。最初の2組は、GROUP BY列名か作成した別名のどちらが重要かを示します列の型に関係なくSELECT。最後の2つのペアは、GROUP BYステートメント内の列データを機能的に操作する必要がある場合、COALESCEは機能しません(タイプに関係なく) –

関連する問題