2016-09-22 4 views
0

나는 (변수) 체크 포인트를 통과 할 때 사이클리스트를위한 mySQL 테이블을 생성하려고합니다. 내가 맨 윗줄의 왼쪽 열 (행 헤더)에서 자전거 정보가있는 테이블로 결과 및 체크 포인트를 표시 할 (열 머리글)MySQL 크로스 탭 테이블

기본 스키마 :

CREATE TABLE timing (`Bib` int, `checkpoint` tinytext, `time` datetime); 

INSERT INTO timing 
    (`Bib` , `checkpoint` , `time`) 
VALUES 
    (100, 'CP1', '2016-09-22 01:00:00'), 
    (101, 'CP1', '2016-09-22 01:30:00'), 
    (102, 'CP1', '2016-09-22 02:00:00'), 
    (100, 'CP2', '2016-09-22 02:00:00'), 
    (101, 'CP2', '2016-09-22 02:30:00'), 
    (100, 'CP3', '2016-09-22 03:00:00'), 
    (103, 'CP2', '2016-09-22 04:00:00') 
; 

SQL :

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
     CONCAT(
     '(CASE WHEN checkpoint = ''', 
     checkpoint, 
     ''' THEN time else 0 END) AS `', 
     checkpoint, '`' 
    ) 
) INTO @sql 
FROM timing; 

SET @sql 
    = CONCAT('SELECT Bib, ', @sql, ' 
      from timing 
      group by Bib'); 

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

결과는 전체 테이블 즉, 난 단지 라이더가 첫 번째 체크 포인트를 통과 처음보고 있어요 채우기되지 않습니다. CONCAT에서 집계 함수를 사용하면 날짜 시간으로 다시 변환해야하는 숫자 값을 얻을 수 있습니까? 확실히 여러 단계를 거치지 않고 datetime을 표시 할 수 있습니까?

무엇이 누락 되었습니까?

TIA. 나는 ... 문제는 관계 오류로 인해 발생되고 있었다 나의 논리 -

+0

예상 출력을 추가하십시오 – 1000111

답변

0

감사를 놓친 것 같아요 지금은 내가 원하는 것보다 훨씬 더 복잡한 해결책을 가지고 있지만 실제로 효과가 있으며 실제로는 강력합니다.

예, 1000111 결국 집계 함수를 사용하여 결과를 다시 읽을 수있는 형식으로 변환해야했습니다. 내가 끝내 많은 다른 단계 중 하나 :

0

나는 그냥 MAX

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
     CONCAT(
     'MAX(CASE WHEN checkpoint = ''', 
     checkpoint, 
     ''' THEN time else 0 END) AS `', 
     checkpoint, '`' 
    ) 
) INTO @sql 
FROM timing; 

SET @sql 
    = CONCAT('SELECT Bib, ', @sql, ' 
      from timing 
      group by Bib'); 

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

SEE DEMO 모든 응답 메시지에 대한