SQL GROUP BY
および ORDER BY
句の列名
質問:
SQL でデータをグループ化する場合、GROUP BY
句と ORDER BY
句に正しい列名を指定する必要があります。入力列と出力列の間に名前の競合がある場合、結果が不正確になる可能性があります。
解決策:
GROUP BY
条項ソース列名の使用を避ける: グループ化にソース列名 (例: attempt.result
) を直接使用しないでください。グループ化は、目的の結果を決定する CASE
式を使用して行う必要があります。これにより、正しい値でグループ化することができます。
<code class="language-sql"> GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>
列の別名を使用する: 元の列名を使用したい場合は、SELECT
リストに別の別名を指定します。これにより、出力列がグループ化に干渉するのを防ぎます。
<code class="language-sql"> SELECT ... , CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1 GROUP BY model.name, attempt.type, result1</code>
ORDER BY
条項位置参照を使用する: 出力列名を直接引用する代わりに、ORDER BY
句で位置参照 (序数) を使用します。これにより、潜在的な名前の競合が回避されます。
<code class="language-sql"> ORDER BY 1, 2, 3</code>
例:
正しい JOIN
構文、位置参照を使用してクエリを書き直し、名前の競合を解決します。
<code class="language-sql">SELECT m.name, a.type, CASE WHEN a.result = 0 THEN 0 ELSE 1 END AS result, CURRENT_DATE - 1 AS day, count(*) AS ct FROM attempt a JOIN prod_hw_id p USING (hard_id) JOIN model m 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>
以上がSQL の GROUP BY 句と ORDER BY 句での名前の競合を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。