2012-12-01 2 views
0

MySQL에서 크로스 탭 쿼리를 생성하고 싶습니다. group_concat을 사용했으나 작동하지 않습니다.mysql group_concat 다른 쿼리 열리스트로 출력

set @v1 = (SELECT GROUP_CONCAT(DISTINCT 
CONCAT('\\nsum(CASE WHEN myear=\"', myear ,'\" 
THEN amount ELSE NULL END) AS\"', myear,'\"')) AS column_list 
FROM mdata 
where myear > 1972 and myear < 1974); 
select myear, amount, @v1 from mdata; 

그것은 @v1에 있지만 이진 필드 년의 목록을 만들어 : 나는 올해의 목록을 생성하려면 다음 쿼리를 발표했다. 크로스 탭 쿼리를 만들기 위해 다음 쿼리에서이 쿼리를 사용하고 싶습니다.

PHP로 첫 번째 쿼리를 실행하고 변수에 값을 저장하고 다음 쿼리에서 사용할 수 있지만 MySQL에서 어떻게 수행 할 수 있습니까?

+1

이 테이블과 예상 출력을 보여주십시오. :) – bonCodigo

답변

1

당신은 SQL에서 문이 실행되는 prepare에 있습니다

SET @v1 = (
    SELECT CONCAT(' 
    SELECT myear, amount, ', 
      GROUP_CONCAT(DISTINCT CONCAT(
      'SUM(CASE WHEN myear=', QUOTE(myear), ' THEN amount END) 
       AS `', REPLACE(myear, '`', '``'), '`' 
      )), ' 
    FROM mdata' 
) 
    FROM mdata 
    WHERE myear > 1972 AND myear < 1974 
); 

PREPARE stmt FROM @v1; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

주어진 오류가 작동하지 않는 "알 수없는 준비된 명령문 처리기 (stmt) 주어진 DEALLOCATE PREPARE"두 번째 나는 변수를 설정하려고 다음 선택 $ v1 그 반환 null. 내 데이터는 이런 식으로 .. 내 테이블 구조 acode, 금액, 년 그냥 acode 1972 1973 1972 .... 같은 십자가 탭 데이터를 표시하고 싶습니다 .... 올해 표제 쇼 금액 아래. 어디 조항은 restict에 적용되지 않습니다 테이블만큼 많은 년간 보여라 – user1480032

+0

@ user1480032 : [this] (http://sqlfiddle.com/#!2/8fe04/1/2)처럼? 이 경우 왜 [this] (http://sqlfiddle.com/#!2/8fe04/2/0)를 수행하지 않는지 궁금하지 않습니까? – eggyal

+0

나는 내 요청을 오해하는 것 같아. 나는 당신이 내가 10 년의 데이터를 가지고 있다면 10 년 동안 10 컬럼을 표시 할 것인가? 매년 ... – user1480032