9

if in group by 句を実行する方法はありますか?

列の値に基づいて結果をグループ化するクエリがあります

列が Null の場合は結果をそのままにしておきたいのですが、そうでない場合はその値でグループ化したいですか? どうやってそれをしますか?

編集:申し訳ありませんが、より具体的な例を挙げるべきだと思います

以下の列には、カテゴリ、スレッド、返信の ID が含まれています

フォーラム用です

null 値を持つものは、応答がないことを意味します

返信が null の場合、グループ化したくありません

目的は、カテゴリ内の返信とスレッドをカウントすることです

返信の値をnullに設定しませんでした。結合の結果が原因で、そのようになっています

| category | thread | reply   |
-------------------------------
| 1        | 1      | 1       |
| 1        | 1      | 2       |
| 1        | 2      | 3       |
| 2        | 3      | 4       |
| 3        | 4      | 5       |
| 3        | 4      | 6       |
| 4        | 5      | null    |
| 5        | 6      | null    |

結果は次のようになります

| category | thread | reply |
-----------------------------
| 1        | 3      | 3     |
| 2        | 1      | 1     |
| 3        | 2      | 2     |
| 4        | 1      | null  |
| 5        | 1      | null  |
4

6 に答える 6

15

実際には、GROUP BY または ORDER BY 句に CASE ステートメントを含めることができます。

ORDER BY CASE
            WHEN reply IS NULL THEN 1  
            ELSE 0 
         END, category
于 2013-07-10T07:11:02.263 に答える
4

mysql 5.6 以降では、order by 句で IF() を使用できます。

このような:

ORDER BY IF(reply=NULL, 1, 0), category

特定のケースに対する正しい答えではないかもしれませんが、このようなものを探している他の人にとっては便利です。

于 2014-07-21T14:21:45.300 に答える
1

あなたが正しいことを理解したら、この方法を試してください:

(
SELECT category, COUNT(thread) AS thread, COUNT(reply) AS reply
  FROM test
  WHERE reply IS NOT NULL
  GROUP BY category
)
UNION ALL
(
SELECT category, COUNT(thread) AS thread, reply
  FROM test
  WHERE reply IS NULL
  GROUP BY category
)
ORDER BY category

SQL フィドル

于 2013-07-10T06:32:47.363 に答える
0

MySQL は、fr=null を持つすべての行を 1 つにグループ化します。これは、あたかもそれが通常の値であるかのようです。

あなたの問題を解決するために、新しい列が fr の値 (null ではない場合) を取得するか、fr の通常の範囲外の増分値、おそらく負の値を取得するテーブルのサブ選択を行います。そして、その新しい仮想列で外側の選択グループを実行します。

set @i := 0;

select if(virtualFR<0,null,virtualFR) as fr, sum(fr_sum) from
(select *, if(fr is null,@i:=@i-1,fr) as virtualFR from myTable) virtual
group by virtualFR;

sqlfiddle

于 2013-07-10T06:15:09.107 に答える
0

これを簡単に行うことができます:

select min(id) id, sum(fr_sum) fr_sum, fr
from mytable
group by 3
于 2013-07-10T06:16:41.947 に答える