SQL 그룹화 및 정렬에서 여러 결과 행 처리
데이터를 그룹화하고 정렬하는 쿼리에서는 그룹화 키가 동일한 여러 행이 있지만 다른 열의 값이 다른 경우가 종종 발생합니다. 이로 인해 필요한 집계 데이터를 얻지 못할 수 있습니다.
예를 들어 하드웨어 모델별로 데이터를 그룹화하는 쿼리는 동일한 모델에 대해 서로 다른 '결과'가 포함된 여러 행을 반환할 수 있습니다. 이를 모델당 하나의 행으로 압축하려면 실제 0 값이 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!