SQLite의 피벗 테이블 구조
소개:
긴 형식이라고도 알려진 데이터 병합은 SQLite에 데이터를 저장하는 일반적인 방법입니다. 그러나 때로는 이 데이터를 넓은 형식으로 변환해야 할 때도 있습니다. 여기서 각 행은 과목을 나타내고 열은 특정 학생의 해당 과목 점수를 나타냅니다. 이 과정을 관점이라고 합니다.
문제 설명:
두 개의 테이블이 있습니다. 하나는 학생 데이터(학생, 이름)를 저장하는 테이블이고 다른 하나는 다양한 과목(학생, 과목 ID, 점수)의 점수를 저장하는 테이블입니다. 이 작업은 각 행이 학생을 나타내고 열이 특정 과목의 점수를 나타내는 넓은 형식으로 학생 정보를 검색하는 것입니다.
CASE 및 GROUP BY를 사용한 솔루션:
<code class="language-sql">SELECT si.studid, si.name, SUM(CASE WHEN md.subjectid = 3 THEN md.marks END) AS subjectid_3, SUM(CASE WHEN md.subjectid = 4 THEN md.marks END) AS subjectid_4, SUM(CASE WHEN md.subjectid = 5 THEN md.marks END) AS subjectid_5 FROM student_info si JOIN markdetails md ON md.studid = si.studid GROUP BY si.studid, si.name;</code>
이 솔루션은 SUM() 집계 함수에 CASE 문을 사용합니다. 각 subjectid(3, 4, 5)에 대해 markdetails 테이블에 일치하는 행이 포함되어 있는지 확인하고 해당 점수를 합산합니다. GROUP BY 절을 사용하면 결과가 학생 ID 및 이름별로 그룹화됩니다.
왼쪽 외부 조인을 사용하는 대체 솔루션:
<code class="language-sql">SELECT u.stuid, u.name, s3.marks AS subjectid_3, s4.marks AS subjectid_4, s5.marks AS subjectid_5 FROM student_info u LEFT OUTER JOIN markdetails s3 ON u.stuid = s3.stuid AND s3.subjectid = 3 LEFT OUTER JOIN markdetails s4 ON u.stuid = s4.stuid AND s4.subjectid = 4 LEFT OUTER JOIN markdetails s5 ON u.stuid = s5.stuid AND s5.subjectid = 5;</code>
이 대체 솔루션은 LEFT OUTER JOIN을 사용하여 학생들을 markdetails 테이블의 해당 점수와 일치시킵니다. 특정 과목에 대한 점수가 없는 학생의 경우 점수 열(subjectid_3, subjectid_4, subjectid_5)이 NULL로 반환됩니다.
위 내용은 SQLite에서 학생 표시 데이터를 긴 형식에서 넓은 형식으로 전환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!