2013-07-21 2 views
2

동적 열이있는 피벗 테이블을 가져 오려고합니다. USER_ID이 문자열 인 경우, 잘 작동하지만 경우 INT는,MySQL 동적 피벗 테이블

여기

내가 과거 질문의 도움으로 지금까지 무엇을 가지고 실패 할 것 같다

CREATE TABLE measure2 
    (`inspection_date` date, `user_id` int, `score` int, comment text) 
; 

INSERT INTO measure2 
    (`inspection_date`, `user_id`, `score`, comment) 
VALUES 
    ('2012-10-16', 0, 0, null), 
    ('2012-10-16', 1, 0, null), 
    ('2012-10-16', 2, 0, null), 
    ('2012-10-16', 3, 0, null), 
    ('2012-10-17', 0, 1, null), 
    ('2012-10-17', 1, 1, null), 
    ('2012-10-17', 2, 1, null), 
    ('2012-10-18', 3, 1, null) 
; 


SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when user_id = ''', 
     user_id, 
     ''' then score end) AS ', 
     user_id 
    ) 
) INTO @sql 
FROM measure2; 

SET @sql = CONCAT('SELECT inspection_date, ', @sql, ' 
        FROM measure2 
        GROUP BY inspection_date'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

참조 : http://sqlfiddle.com/#!2/eab24/1

확실한 무엇인가 그것의 간단한, 그러나 나는 무엇이 없는가? 값이 int에 있기 때문에 당신이 그들에게 열 이름을 만들고있다

감사

답변

2

, 당신은

는 SQL이 보이는 것 백틱의 값을 마무리해야 같은 :

max(case when user_id = 1 then score end) as `1` 

전체 검색어는 다음과 같습니다.

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when user_id = ''', 
     user_id, 
     ''' then score end) AS `', 
     user_id, '`' 
    ) 
) INTO @sql 
FROM measure2; 

SET @sql = CONCAT('SELECT inspection_date, ', @sql, ' 
        FROM measure2 
        GROUP BY inspection_date'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with Demo

+0

+1 GMTA, 그들이 말하는대로 ... –

+0

굉장한 감사합니다! –

+0

안녕하세요, 선생님, 일부 동적 피벗 테이블을 파고,이 내 관심을 잡았 .. 그리고 내가 알고 싶어이 쿼리는 PHP에서 작동하는 방법 또는 어떻게 PHP 에서이 쿼리를 할 수 – CallMeJeo

1

단순 실제로 - 혼자 숫자, SQL에서 유효한 열 이름없는 당신이 역 따옴표로 묶어하도록 코드를 수정해야 할 수 있도록 : 나뿐만 아니라 문자열 값이 변화를 유지하는 것이 좋습니다

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when user_id = ', 
     user_id, 
     ' then score end) AS `', 
     user_id, 
     '`' 
    ) 
) INTO @sql 
FROM measure2; 

SET @sql = CONCAT('SELECT inspection_date, ', @sql, ' 
        FROM measure2 
        GROUP BY inspection_date'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

을, 문자열 값 중 일부가 예약어와 일치하거나 공백을 포함하는 경우

(또한, ' 숫자 값 주위 요구되지 않는다, 그래서 경우 절에서 이들을 제거했다.)

SQLFiddle here한다.

+0

고마워! 당신과 bluefeet 거의 동일한 시간에 게시해야합니다! –