ホームページ >データベース >mysql チュートリアル >SQL でデータをグループ化して並べ替えるときに複数の結果行を処理する方法
SQL のグループ化と並べ替えでの複数の結果行の処理
データをグループ化して並べ替えるクエリでは、同じグループ化キーを持つ複数の行が、他の列の値が異なるという状況がよく発生します。これにより、必要な集計データが取得できなくなる可能性があります。
たとえば、ハードウェア モデルごとにデータをグループ化するクエリは、同じモデルに対して異なる「結果」を含む複数の行を返す場合があります。これをモデルごとに 1 行に圧縮するには、実際の 0 値が 0 値になり、ゼロ以外の値が 1 値になるようにクエリを変更します。ただし、このアプローチでも、複数の「結果」値を持つモデルに対して複数の行が生成されます。
目的の集計を実現するための鍵は、結果を表すソース列ではなく CASE 式によってグループ化することです。条件値でグループ化することにより、クエリは同じグループ化キーと条件結果を持つ行を結合できます。
たとえば、次のクエリは、モデル名、試行タイプ、および結果値の変換に使用される CASE 式によってグループ化されます。
<code class="language-sql">SELECT CURRENT_DATE-1 AS day, model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END, count(*) FROM attempt attempt, prod_hw_id prod_hw_id, model model WHERE time >= '2013-11-06 00:00:00' AND time < '2013-11-07 00:00:00' GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END ORDER BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END;</code>または、CASE 式の列エイリアスを使用して、結果ソース列と区別することもできます。
<code class="language-sql">SELECT CURRENT_DATE-1 AS day, model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1, count(*) FROM attempt attempt, prod_hw_id prod_hw_id, model model WHERE time >= '2013-11-06 00:00:00' AND time < '2013-11-07 00:00:00' GROUP BY model.name, attempt.type, result1 ORDER BY model.name, attempt.type, result1;</code>位置参照 (「GROUP BY 1,2,3」など) を使用した CASE 式によるグループ化は、GROUP BY 句で列名を使用するよりも SELECT リストの変更に対する耐性が高いことを覚えておくことが重要です。
以上がSQL でデータをグループ化して並べ替えるときに複数の結果行を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。