[mysql] MySQL에서 피벗 테이블 출력을 어떻게 반환합니까?

다음과 같은 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()기능과이를됩니다 부울로 평가 01 때문에 당신은 사용하지 않고 카운트가 당신의 기준에 따라 할 수 있습니다 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;

SQL 바이올린.

어떻게?

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, 테이블 본문의 값 및 테이블 관계 (있는 경우)를 지정하기 만하면됩니다.
MySQL 피벗 테이블

이 도구의 홈 페이지는 http://mysqlpivottable.net 입니다 .