[CakePHP3]クエリービルダーで少しハマった-CASE、COUNT、SUM

こんな感じのSELECT文をクエリービルダーで作りたかった。

SELECT user_id,SUM(CASE WHEN flg = ‘1’ THEN 1 ELSE 0 END) cnt FROM hoge GROUP user_id

なので、以下のようにしました。

$query = $this->Hoge->find();

$hogeCase = $query->newExpr()
->addCase(
    [$query->newExpr()->add(['flg' => '1'])],
    [1,0],
    ['integer','integer']
);

$query->select([
    "user_id" => "user_id",
    "cnt" => $query->func()->sum($hogeCase)
])
->group("user_id");

ですが、上記にすると「関数sum(text)は存在しません」とエラーになってしまい、動きませんでした。

ログに出力された実行後のSELECT文は、pgAdminで実行することはできましたが、なぜかクエリービルダーでは上記のエラーになってしまいす。

 

CakePHP3のドキュメントを見たら、COUNT()を使って集計している例があったので、もしかしてこれならいけるのかと思い試してみました。

とりあえず、上記のコードを修正して、COUNT()で集計するようにしました。

$query = $this->Hoge->find();
 
$hogeCase = $query->newExpr()
->addCase(
    $query->newExpr()->add(['flg' => '1']),
    1,
    'integer'
);
 
$query->select([
    "user_id" => "user_id",
    "cnt" => $query->func()->count($hogeCase)
])
->group("user_id");

これなら想定していたデータが取得できました。

COUNT()は、NULLのデータはカウントされないんですね。知らなかった。。。

 

いままでCOUNT()関数をなんとなく使っていたので、今回こういうことがあって、ちょっと勉強になったのでよかったのかなと思います。