이것은 기본적 이다 피벗 테이블.
이것을 달성하는 방법에 대한 좋은 튜토리얼은 여기에서 찾을 수 있습니다 : http://www.artfulsoftware.com/infotree/qrytip.php?id=78
이 게시물을 읽고이 솔루션을 필요에 맞게 조정하는 것이 좋습니다.
최신 정보
위의 링크를 더 이상 사용할 수 없으면 여기에서 mysql 피벗 답변을 검색하는 모든 사용자에게 추가 정보를 제공해야한다고 생각합니다. 그것은 실제로 방대한 양의 정보를 가지고 있었고, 여기에 모든 것을 넣지 않을 것입니다 (심지어 방대한 지식을 복사하고 싶지 않기 때문에). 그러나 피벗을 다루는 방법에 대한 조언을 줄 것입니다. 처음에는 질문을 한 peku의 예제와 함께 일반적으로 SQL 방식을 표로 표시합니다.
어쩌면 링크가 곧 다시 올 수 있습니다. 계속 주시하겠습니다.
스프레드 시트 방식 ...
많은 사람들이이 목적으로 MSExcel, OpenOffice 또는 기타 스프레드 시트 도구와 같은 도구를 사용합니다. 이것은 유효한 솔루션입니다. 데이터를 복사하고 GUI가 제공하는 도구를 사용하여 해결하십시오.
그러나 ... 이것은 문제가 아니 었으며 데이터를 스프레드 시트로 가져 오는 방법, 문제가있는 스케일링 등과 같은 단점을 초래할 수도 있습니다.
SQL 방식 ...
그의 테이블은 다음과 같습니다.
CREATE TABLE `test_pivot` (
`pid` bigint(20) NOT NULL AUTO_INCREMENT,
`company_name` varchar(32) DEFAULT NULL,
`action` varchar(16) DEFAULT NULL,
`pagecount` bigint(20) DEFAULT NULL,
PRIMARY KEY (`pid`)
) ENGINE=MyISAM;
이제 원하는 테이블을 살펴보십시오.
company_name EMAIL PRINT 1 pages PRINT 2 pages PRINT 3 pages
-------------------------------------------------------------
CompanyA 0 0 1 3
CompanyB 1 1 2 0
행 ( EMAIL
, PRINT x pages
)은 조건과 유사합니다. 주요 그룹은입니다 company_name
.
조건을 설정하기 위해 CASE
-statement 를 사용하는 것이 좋습니다. 무언가로 그룹화하려면 ...을 사용하십시오 GROUP BY
.
이 피벗을 제공하는 기본 SQL은 다음과 같습니다.
SELECT P.`company_name`,
COUNT(
CASE
WHEN P.`action`='EMAIL'
THEN 1
ELSE NULL
END
) AS 'EMAIL',
COUNT(
CASE
WHEN P.`action`='PRINT' AND P.`pagecount` = '1'
THEN P.`pagecount`
ELSE NULL
END
) AS 'PRINT 1 pages',
COUNT(
CASE
WHEN P.`action`='PRINT' AND P.`pagecount` = '2'
THEN P.`pagecount`
ELSE NULL
END
) AS 'PRINT 2 pages',
COUNT(
CASE
WHEN P.`action`='PRINT' AND P.`pagecount` = '3'
THEN P.`pagecount`
ELSE NULL
END
) AS 'PRINT 3 pages'
FROM test_pivot P
GROUP BY P.`company_name`;
원하는 결과를 매우 빠르게 제공해야합니다. 이 방법의 주요 단점은 피벗 테이블에 원하는 행이 많을수록 SQL 문에 더 많은 조건을 정의해야합니다.
이것도 다룰 수 있으므로 사람들은 준비된 진술, 루틴, 카운터 등을 사용하는 경향이 있습니다.
이 주제에 대한 추가 링크 :