2014-02-21 2 views
0

이 피벗을 완료하는 데 문제가 있습니다. 나는 모든 종류의 물건을 시험하고있다. 그러나 나는 단지 이것을 올바르게하는 것처럼 보이지 않는다. 그러나 운이 좋으면 일반적으로 다시 시작해야 할 수도 있습니다.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 | 
+---------+--------------+--------------+--------------+ 

나는 시도했다 :

  1. I했습니다 이미 나에게
  2. 로 계산하는 정확한 데이터를 제공하는 내부 쿼리를 reworte
  3. MAX(), MIN() 및 SUM()에 CASE 절을 포함합니다.
  4. CASE 절에 대한 ELSE가 제거되었습니다. h는 결과 나에게 NULLS를 제공는
  5. 이 @AgRizzo 나를 위해 그것을 가지고 절
+1

는 MODULE_ID – AgRizzo

+0

@AgRizzo BY'하지'그룹을, 그게입니다. 고맙습니다. 내가 너무 오랫동안보고 있었던 것을 보여주기 위해 간다. – dmbania

답변

0

에 의해 그룹을 변경 설정합니다. 나는 GROUP BY 절에서 res.module_id을 제거

, 결과는 내가 무엇을 찾고있다.

관련 문제