ホームページ >データベース >mysql チュートリアル >SQL でデータをグループ化して並べ替えるときに複数の結果行を処理する方法

SQL でデータをグループ化して並べ替えるときに複数の結果行を処理する方法

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-10 15:06:44199ブラウズ

How to Handle Multiple Result Rows When Grouping and Ordering Data in 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。