이 피벗을 완료하는 데 문제가 있습니다. 나는 모든 종류의 물건을 시험하고있다. 그러나 나는 단지 이것을 올바르게하는 것처럼 보이지 않는다. 그러나 운이 좋으면 일반적으로 다시 시작해야 할 수도 있습니다.MySql 피벗이 그룹화 된 행을 응축시키지 않습니다.
는 I에 유래 여기에보고했지만, 아무것도 내 상황에 맞는 것 같다. 내가 읽은 다른 문제가 모든 숫자 데이터를위한 것이라고 말할 수있는만큼. 문제가 될 수있는 숫자와 문자열이 혼합되어 있지만 여기에 몇 가지 눈 모음이 더 필요합니다.
나는 그들이 가지고 각 레슨에 대한 각 시스템의 사용자와 자신의 점수에 대한 행을 표시하는 보고서를 쓰고 있어요. 피벗 된 열은 "수업 모듈"을 나타내며 "시작되지 않음"또는 "불완전한"점수를 표시합니다.
다음은 몇 가지 쿼리의 결과입니다. 이것은 올바른 :
"결과"
+---------+-----------+--------------+-------------+
| 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은 첫 번째 열에서 유지되며, 다음 3 열은 수업의 수와 동일한 컬럼의 수에 대한 사용자의 결과로 선회한다. 사용자의 점수 (0.0 =< x =< 1.0)
, 또는 두 개의 리터럴 중 하나 :이 예에서 교훈 (모듈)에 대한 다음과 같은 세 개의 열 89, 90 및 91
나는 세 가지 값 중 하나를 반환 기능 "getModuleScore"
을 만들 수있을 것 ' 시작되지 않았 음 '또는'불완전하다 '. (이 함수가 수행하는 기능에 대한 간략한 설명입니다 - 방금 쓴 것보다 더 많은 것이 있습니다.)
다음 결과를 사용하여 이전 결과 (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 |
+---------+--------------+--------------+--------------+
나는 시도했다 :
- I했습니다 이미 나에게 로 계산하는 정확한 데이터를 제공하는 내부 쿼리를 reworte
- MAX(), MIN() 및 SUM()에 CASE 절을 포함합니다.
- CASE 절에 대한 ELSE가 제거되었습니다. h는 결과 나에게 NULLS를 제공는
- 이 @AgRizzo 나를 위해 그것을 가지고 절
는 MODULE_ID – AgRizzo
@AgRizzo BY'하지'그룹을, 그게입니다. 고맙습니다. 내가 너무 오랫동안보고 있었던 것을 보여주기 위해 간다. – dmbania