2013-04-14 2 views
2

제가이 제목이 정확하게 쓰이지는 않았지만 제가 찾고있는 것을 설명해 드리겠습니다.mySQL의 크로스 탭보기?

두 개의 테이블이 있습니다.

clID (primary key) 
ClName (varchar) 

점수

ID  (Primay key) 
clID (F Key) 
PlayDate (Date/Time) 
Score  (double) 

클라이언트 테이블 데이터가이

clID clName 
1  Chris 
2  Gale 
3  Donna 
과 같은

클라이언트 691,363,210

점수 테이블 데이터는 다음 나중에 내가 할 수 있어야 할 또 다른 새로운 클라이언트가있는 경우이

Date   Chris Gale Donna 
12/01/2012 0.0122 -  - 
13/01/2012 0.0053 -  - 
23/01/2012  -  -0.0125 - 
24/01/2012  -  0.1011 0.0002 
26/01/2012  -  - -0.0056 
27/01/2012  -  - 0.0001 

모양을보기를 만들 수 있나요이

ID clID PlayDate Score 
1 2  23/01/2012 -0.0125 
2 2  24/01/2012 0.1011 
3 3  24/01/2012 0.0002 
4 3  26/01/2012 -0.0056 
5 3  27/01/2012 0.0001 
6 1  12/01/2012 0.0122 
7 1  13/01/2012 0.0053 

처럼 보인다 이보기에서 새로 작성 될 새 열의 새 클라이언트에 대한 데이터를 점검하십시오.

미리 감사드립니다.

+1

이 링크를 확인해보십시오. http://stackoverflow.com/questions/2852708/converting-mysql-resultset-from-rows-to-columns 또는 http://stackoverflow.com/questions/4336985/can-a -mysql-query-turn-rows-into-columns. 첫 번째는 행 - 열 값을 알고 두 번째 값을 GROUP_CONCAT로 사용하지만 행을 실제로 열로 만들지 않으면 좋을 것입니다. – Edper

답변

5

이러한 유형의 데이터 변환을 PIVOT이라고합니다. MySQL에는 피벗 함수가 없지만 CASE 표현식을 가진 집계 함수를 사용하여 결과를 얻을 수 있습니다.

select s.playdate, 
    sum(case when clname = 'Chris' then score end) Chris, 
    sum(case when clname = 'Gale' then score end) Gale, 
    sum(case when clname = 'Donna' then score end) Donna 
from clients c 
inner join scores s 
    on c.clid = s.clid 
group by s.playdate; 

SQL Fiddle with Demo를 참조하십시오 clients의 이름을 미리 알고있는 경우

는, 당신은 하드 코드 조회 할 수 있습니다.

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(CASE WHEN clName = ''', 
     clName, 
     ''' THEN score else ''-'' END) AS `', 
     clName, '`' 
    ) 
) INTO @sql 
FROM clients; 

SET @sql 
    = CONCAT('SELECT s.playdate, ', @sql, ' 
      from clients c 
      inner join scores s 
       on c.clid = s.clid 
      group by s.playdate'); 

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

: 당신이 고객의 알 수없는 번호가하거나 코드를 변경하지 않고도 포함시킬 것 신규 고객을 추가 할 경우

는, 당신은 동적 SQL을 생성 할 준비가 문을 사용할 수 있습니다 SQL Fiddle with Demo을 참조하십시오. 두 쿼리 모두 동일한 결과를 제공합니다.

+0

나는 관점의 관점에서 더 생각하고있었습니다. 새로운 클라이언트가 추가되면보기를 삭제하고보기를 다시 만드는 절차가있을 수 있습니다. – cjv

+0

@cjv 작동하는지 확인하기 위해 테스트해야합니다. – Taryn

+0

대단한 트릭이지만 많은 양의 큰 테이블이 있으면 너무 무거워요./ – Thermech