>  Q&A  >  본문

MySQL에서 CASE 문 사용 최적화

<p>안녕하세요 여러분</p> <p>위 스크린샷과 같은 테이블이 있습니다. 필요한 추가 열을 반환하도록 <code>CASE</code> 문을 사용하여 쿼리를 작성했습니다. 제가 작성한 쿼리는 다음과 같습니다. </p> <pre class="brush:php;toolbar:false;">SELECT *, CASE WHEN (SUM(CASE WHEN 클래스 = '클래스 1' THEN 1 END) OVER(PARTITION BY 학생_ID)) >= 1 THEN 1 ELSE 0 END AS '클래스 1', CASE WHEN (SUM(CASE WHEN 클래스 = '클래스 2' THEN 1 END) OVER(PARTITION BY 학생_ID)) >= 1 THEN 1 ELSE 0 END AS '클래스 2', CASE WHEN (SUM(CASE WHEN 클래스 = '클래스 3' THEN 1 END) OVER(PARTITION BY 학생_ID)) >= 1 THEN 1 ELSE 0 END AS '클래스 3', CASE WHEN (SUM(CASE WHEN 클래스 = '클래스 4' THEN 1 END) OVER(PARTITION BY 학생_ID)) >= 1 THEN 1 ELSE 0 END AS '클래스 4' qa;</pre> <p>다음은 제가 얻은 결과 표입니다.</p> <p>이 쿼리에서 제가 원하는 것은 학생이 강좌에 참석한 경우 해당 학생에게 속한 모든 행에 대해 클래스 열 아래에 <code>1</code>을 표시하는 것입니다. </p> <p>예를 들어, <code>student_id</code> <code>2</code> ;/code> 열 아래에서 <code>student_id</code>에 대한 두 행은 <code> </p> <p>쿼리에서 원하는 결과를 얻었지만 이제 <code>1</code>를 사용하는 대신 클래스의 <code>enrollment_date</code>를 사용하고 싶습니다. 제가 원하는 최종 결과는 다음과 같습니다. </p> <p>위 스크린샷의 최종 출력을 얻으려면 쿼리를 어떻게 수정해야 하는지 알 수 있나요? </p> <p><strong>두 번째 질문:</strong></p> <p>위 쿼리에서 볼 수 있듯이 각 클래스에는 해당 클래스에 대한 열을 생성하는 별도의 <code>CASE</code> 문이 있습니다. 그러나 앞으로는 5,6,7,... 클래스가 있을 수 있으므로 다른 새 클래스가 있을 때마다 <code>CASE</code> 문을 다시 추가해야 합니다.어쨌든 4개의 다른 클래스에 대해 4개의 <code>CASE</code> 문을 가질 필요가 없도록 쿼리를 최적화할 수 있지만 여전히 다른 클래스에 대한 열을 만들 수 있습니다(새 클래스가 있는 경우). , 새로운 열이 있을 것입니다) 클래스도 있습니다)? </p>

샘플 데이터

<pre class="brush:php;toolbar:false;">테이블 qa( 학생_ID INT, 클래스 varchar(20), 수업_종료_날짜 날짜, 등록_날짜 날짜 ); qa에 삽입(학생_ID, 수업, 수업_종료일, 등록_날짜) 가치 (1, '클래스 1', '2022-03-03', '2022-02-14'), (1, '클래스 3', '2022-06-13', '2022-04-12'), (1, '클래스 4', '2022-07-03', '2022-06-19'), (2, '클래스 1', '2023-03-03', '2022-07-14'), (2, '클래스 2', '2022-08-03', '2022-07-17'), (4, '클래스 4', '2023-03-03', '2022-012-14'), (4, '클래스 2', '2022-04-03', '2022-03-21') ;</pre></p>
P粉463840170P粉463840170431일 전553

모든 응답(2)나는 대답할 것이다

  • P粉670107661

    P粉6701076612023-09-05 12:32:12

    테이블 정의 및 데이터를 기반으로 쿼리를 생성하고 [선택적으로] 실행하는 저장 프로시저에 대해서는 Pivot을 참조하세요.

    회신하다
    0
  • P粉785522400

    P粉7855224002023-09-05 00:46:12

    수업종료일과 등록일을 모두 포함하는 예시입니다 -

    으아악

    회신하다
    0
  • 취소회신하다