SQL GROUP BY 句と ORDER BY 句での名前の競合を避けるためのヒント
複数の列の組み合わせと並べ替えを伴う SQL クエリでは、出力列名とソース列名の間に名前の違いがある可能性があるため、GROUP BY
句と ORDER BY
句で使用される列名を慎重に検討する必要があります。 SQL言語の競合で。
たとえば、クエリの目的は、ハードウェア モデル (名前)、試行タイプ (タイプ)、およびバイナリ結果 (0 または 1 に単純化された結果) によってデータをグループ化することです。ただし、望ましい出力は、タイプとケースの一意の組み合わせを持つモデルごとに 1 行のみを表示することです。
この問題は、GROUP BY
式と CASE
式の両方でソース列名 result
を使用することで発生します。 SQL 標準では、この場合、GROUP BY
は result
をソース列名として解釈し、ORDER BY
を出力列名として解釈すると規定されています。
この競合を解決して期待どおりの出力を得るには、いくつかの方法があります:
CASE
式に別名を追加し、ソース列名とは異なるようにします。例: <code class="language-sql">... CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1 ... GROUP BY model.name, attempt.type, result1 ...</code>
<code class="language-sql">... GROUP BY 1, 2, 3 ...</code>
GROUP BY
に含める必要はありませんが、わかりやすくするために、結果に影響を与えることなく追加できます。 位置参照を使用して変更されたクエリは次のとおりです:
<code class="language-sql">SELECT model.name , attempt.type , CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result , CURRENT_DATE - 1 AS day , count(*) AS ct FROM attempt JOIN prod_hw_id USING (hard_id) JOIN model USING (model_id) WHERE ts >= '2013-11-06 00:00:00' AND ts < '2013-11-07 00:00:00' GROUP BY 1, 2, 3 ORDER BY 1, 2, 3;</code>
正しい列名を確保し、位置参照を使用することにより、クエリは期待どおりにデータを集計し、モデル、型、結果の一意の組み合わせごとに 1 行の結果のみを提供するようになりました。
以上がSQL GROUP BY 句と ORDER BY 句での名前の競合を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。