다음과 같은 MySQL 테이블이있는 경우 :
company_name 작업 페이지 수 ------------------------------- 회사 A 인쇄 3 회사 A 인쇄 2 회사 A 인쇄 3 회사 B 이메일 회사 B 인쇄 2 회사 B 인쇄 2 회사 B 인쇄 1 회사 A 인쇄 3
MySQL 쿼리를 실행하여 다음과 같은 출력을 얻을 수 있습니까?
company_name 이메일 인쇄 1 페이지 인쇄 2 페이지 인쇄 3 페이지 -------------------------------------------------- ----------- 회사 A 0 1 3 회사 B 1 1 0
아이디어 즉 pagecount
출력 열의 양이 그 하나의 각 열에 반영해야하므로 달라질 수 action
/에 pagecount
따라 적중 한 후 한쌍 참조 company_name
. 이것이 피벗 테이블인지 확실하지 않지만 누군가가 제안 했습니까?
답변
이것은 기본적 이다 피벗 테이블.
이것을 달성하는 방법에 대한 좋은 튜토리얼은 여기에서 찾을 수 있습니다 : 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 문에 더 많은 조건을 정의해야합니다.
이것도 다룰 수 있으므로 사람들은 준비된 진술, 루틴, 카운터 등을 사용하는 경향이 있습니다.
이 주제에 대한 추가 링크 :
답변
내 솔루션은 피벗없이 T-SQL에 있습니다.
SELECT
CompanyName,
SUM(CASE WHEN (action='EMAIL') THEN 1 ELSE 0 END) AS Email,
SUM(CASE WHEN (action='PRINT' AND pagecount=1) THEN 1 ELSE 0 END) AS Print1Pages,
SUM(CASE WHEN (action='PRINT' AND pagecount=2) THEN 1 ELSE 0 END) AS Print2Pages,
SUM(CASE WHEN (action='PRINT' AND pagecount=3) THEN 1 ELSE 0 END) AS Print3Pages
FROM
Company
GROUP BY
CompanyName
답변
MySQL을위한 직접에 조건을 넣을 수 있습니다 SUM()
기능과이를됩니다 부울로 평가 0
나1
때문에 당신은 사용하지 않고 카운트가 당신의 기준에 따라 할 수 있습니다 IF/CASE
문을
SELECT
company_name,
SUM(action = 'EMAIL')AS Email,
SUM(action = 'PRINT' AND pagecount = 1)AS Print1Pages,
SUM(action = 'PRINT' AND pagecount = 2)AS Print2Pages,
SUM(action = 'PRINT' AND pagecount = 3)AS Print3Pages
FROM t
GROUP BY company_name
DEMO
답변
동적 피벗의 경우 GROUP_CONCAT
와 함께 사용하십시오 CONCAT
. GROUP_CONCAT의 기능은 다양한 옵션을 하나의 문자열로 그룹에서 문자열을 연결합니다.
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(CASE WHEN action = "',
action,'" AND ',
(CASE WHEN pagecount IS NOT NULL
THEN CONCAT("pagecount = ",pagecount)
ELSE pagecount IS NULL END),
' THEN 1 ELSE 0 end) AS ',
action, IFNULL(pagecount,'')
)
)
INTO @sql
FROM
t;
SET @sql = CONCAT('SELECT company_name, ', @sql, '
FROM t
GROUP BY company_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
답변
부울 논리를 사용 하는 stardard-SQL 버전 :
SELECT company_name
, COUNT(action = 'EMAIL' OR NULL) AS "Email"
, COUNT(action = 'PRINT' AND pagecount = 1 OR NULL) AS "Print 1 pages"
, COUNT(action = 'PRINT' AND pagecount = 2 OR NULL) AS "Print 2 pages"
, COUNT(action = 'PRINT' AND pagecount = 3 OR NULL) AS "Print 3 pages"
FROM tbl
GROUP BY company_name;
어떻게?
TRUE OR NULL
수율 TRUE
.
FALSE OR NULL
수율 NULL
.
NULL OR NULL
수율 NULL
.
그리고 COUNT
단지 null 이외의 값을 계산합니다. 보일라
답변
정답은 다음과 같습니다.
select table_record_id,
group_concat(if(value_name='note', value_text, NULL)) as note
,group_concat(if(value_name='hire_date', value_text, NULL)) as hire_date
,group_concat(if(value_name='termination_date', value_text, NULL)) as termination_date
,group_concat(if(value_name='department', value_text, NULL)) as department
,group_concat(if(value_name='reporting_to', value_text, NULL)) as reporting_to
,group_concat(if(value_name='shift_start_time', value_text, NULL)) as shift_start_time
,group_concat(if(value_name='shift_end_time', value_text, NULL)) as shift_end_time
from other_value
where table_name = 'employee'
and is_active = 'y'
and is_deleted = 'n'
GROUP BY table_record_id
답변
MySQL Pivot 테이블 생성기라는 도구가 있으며 나중에 원하는 경우 Excel로 내보낼 수있는 웹 기반 피벗 테이블을 만들 수 있습니다. 데이터가 단일 테이블 또는 여러 테이블에있는 경우 작동 할 수 있습니다.
열의 데이터 소스 (동적 열을 지원함), rows, 테이블 본문의 값 및 테이블 관계 (있는 경우)를 지정하기 만하면됩니다.
이 도구의 홈 페이지는 http://mysqlpivottable.net 입니다 .