이 피벗을 완료하는 데 문제가 있습니다. 나는 모든 종류의 일을 시도하고 있지만 이것이 정확하지 않은 것 같습니다. 하지만 내 운이 보통이어서 다시 다시 시작해야 할 수도 있습니다.
나는 여기에서 stackoverflow를 보았지만 내 상황에 맞는 것은 없습니다. 내가 읽은 다른 문제는 모든 숫자 데이터에 대한 것입니다. 문제가 될 수있는 숫자와 문자열이 섞여 있지만 이것에 대해 몇 가지 더 많은 눈이 필요합니다.
저는 시스템의 각 사용자에 대한 행과 그들이 수강하는 각 강의에 대한 점수를 표시하는 보고서를 작성하고 있습니다. 피벗 된 열은 "수업 모듈"을 나타내며 점수, "시작되지 않음"또는 "불완전"을 표시합니다.
다음은 몇 가지 쿼리의 결과입니다. 이것은 정확합니다 :
"결과"
+---------+-----------+--------------+-------------+
| user_id | module_id | total_failed | total_taken |
+---------+-----------+--------------+-------------+
| 605 | 89 | 0 | 0 |
| 605 | 90 | 0 | 0 |
| 605 | 91 | 0 | 0 |
| 606 | 89 | 2 | 3 |
| 606 | 90 | 1 | 4 |
| 606 | 91 | 0 | 0 |
| 634 | 89 | 0 | 3 |
| 634 | 90 | 0 | 4 |
| 634 | 91 | 0 | 0 |
+---------+-----------+--------------+-------------+
이 레코드 세트를 사용하여 피벗해야합니다.
user_id는 첫 번째 열에 남아 있고 다음 세 열은 강의 수와 동일한 열 수에 대한 사용자 결과로 피벗됩니다. 이 예에서는 단원 (모듈) 89, 90 및 91에 대한 세 개의 열이 있습니다.
"getModuleScore"
세 가지 가능한 값 중 하나를 반환 하는 함수 를 만듭니다 : 사용자의 점수 (0.0 =< x =< 1.0)
또는 두 개의 리터럴 중 하나 : '시작되지 않음'또는 '불완전'. (이것은이 함수가하는 일에 대한 간단한 설명입니다. 방금 작성한 것보다 조금 더 있습니다.)
다음 SQL을 사용하여 이전 결과 (SQL의 "results"테이블)를 피벗하는 경우
SELECT
results.user_id AS user_id
,
MAX(CASE WHEN module_id = 89
THEN (SELECT getModuleScore(89, total_taken, total_failed))
ELSE
'not_started'
END)
AS `mod_89_score`
,
MAX(CASE WHEN module_id = 90
THEN (SELECT getModuleScore(90, total_taken, total_failed))
ELSE
'not_started'
END)
AS `mod_90_score`
,
MAX(CASE WHEN module_id = 91
THEN (SELECT getModuleScore(91, total_taken, total_failed))
ELSE
'not_started'
END)
AS `mod_91_score`
FROM
results
GROUP BY
results.user_id
, results.module_id
다음 레코드 세트를받습니다.
+---------+--------------+--------------+--------------+
| user_id | mod_89_score | mod_90_score | mod_91_score |
+---------+--------------+--------------+--------------+
| 605 | not started | not_started | not_started |
| 605 | not_started | not started | not_started |
| 605 | not_started | not_started | not started |
| 606 | 0.333333333 | not_started | not_started |
| 606 | not_started | 0.750000000 | not_started |
| 606 | not_started | not_started | not started |
| 634 | 1.000000000 | not_started | not_started |
| 634 | not_started | 1.000000000 | not_started |
| 634 | not_started | not_started | not started |
+---------+--------------+--------------+--------------+
내가 원하는 것은 다음과 같습니다.
+---------+--------------+--------------+--------------+
| user_id | mod_89_score | mod_90_score | mod_91_score |
+---------+--------------+--------------+--------------+
| 605 | not started | not_started | not_started |
| 606 | 0.333333333 | 0.750000000 | not_started |
| 634 | 1.000000000 | 1.000000000 | not_started |
+---------+--------------+--------------+--------------+
내가 시도한 것 :
@AgRizzo는 나를 위해 그것을 얻었습니다.
절 res.module_id
에서 제거했을 때 GROUP BY
결과는 제가 찾고있는 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다