处理SQL分组和排序中多个结果行
在对数据进行分组和排序的查询中,经常会遇到这种情况:具有相同分组键的多个行,但其他列的值不同。这可能会妨碍获得所需的汇总数据。
例如,一个按硬件型号分组数据的查询可能会返回多行,这些行对于同一型号具有不同的“结果”。为了将此压缩成每个型号一行,可以修改查询,将实际的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中文网其他相关文章!