반응형
MySQL 피벗 행을 동적 열 수로 지정
세 가지 MySQL 테이블이 있다고 가정합니다.
테이블products
:
id | name
1 Product A
2 Product B
테이블partners
:
id | name
1 Partner A
2 Partner B
테이블sales
:
partners_id | products_id
1 2
2 5
1 5
1 3
1 4
1 5
2 2
2 4
2 3
1 1
나는 파트너와 함께 줄에 있는 테이블과 상품을 컬럼으로 받고 싶습니다.지금까지 다음과 같은 출력을 얻을 수 있었습니다.
name | name | COUNT( * )
Partner A Product A 1
Partner A Product B 1
Partner A Product C 1
Partner A Product D 1
Partner A Product E 2
Partner B Product B 1
Partner B Product C 1
Partner B Product D 1
Partner B Product E 1
다음 쿼리 사용:
SELECT partners.name, products.name, COUNT( * )
FROM sales
JOIN products ON sales.products_id = products.id
JOIN partners ON sales.partners_id = partners.id
GROUP BY sales.partners_id, sales.products_id
LIMIT 0 , 30
대신 다음과 같은 것을 원합니다.
partner_name | Product A | Product B | Product C | Product D | Product E
Partner A 1 1 1 1 2
Partner B 0 1 1 1 1
문제는 몇 개의 상품이 있는지 알 수 없기 때문에 상품표의 행에 따라 열 번호가 동적으로 변경되어야 한다는 것입니다.
이 매우 좋은 답변은 mysql: T-SQL 피벗에서는 작동하지 않는 것 같습니다. 행 값에서 테이블 열을 생성할 수 있습니다.
유감스럽게도 MySQL에는PIVOT
이 기능은 기본적으로 여러분이 하고자 하는 것입니다.이 때문에, aggregate 함수와 함께 사용할 필요가 있습니다.CASE
스테이트먼트:
select pt.partner_name,
count(case when pd.product_name = 'Product A' THEN 1 END) ProductA,
count(case when pd.product_name = 'Product B' THEN 1 END) ProductB,
count(case when pd.product_name = 'Product C' THEN 1 END) ProductC,
count(case when pd.product_name = 'Product D' THEN 1 END) ProductD,
count(case when pd.product_name = 'Product E' THEN 1 END) ProductE
from partners pt
left join sales s
on pt.part_id = s.partner_id
left join products pd
on s.product_id = pd.prod_id
group by pt.partner_name
제품을 모르기 때문에 이 작업을 동적으로 수행하는 것이 좋습니다.이것은 준비된 스테이트먼트를 사용하여 실행할 수 있습니다.
동적 피벗 테이블(행에서 열로 변환)의 경우 코드는 다음과 같습니다.
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'count(case when Product_Name = ''',
Product_Name,
''' then 1 end) AS ',
replace(Product_Name, ' ', '')
)
) INTO @sql
from products;
SET @sql = CONCAT('SELECT pt.partner_name, ', @sql, ' from partners pt
left join sales s
on pt.part_id = s.partner_id
left join products pd
on s.product_id = pd.prod_id
group by pt.partner_name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
아마 유의할 필요가 있을 것이다GROUP_CONCAT
디폴트로는 1024바이트로 제한되어 있습니다.이 문제를 해결하려면 절차 기간 동안 더 높게 설정해야 합니다. SET @@group_concat_max_len = 32000;
언급URL : https://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns
반응형
'itsource' 카테고리의 다른 글
MariaDB가 원격 연결을 허용하지 않음 (0) | 2023.01.15 |
---|---|
SQL은 1 x N 중에서 선택할 수 있으며, 모든 크기가 (0) | 2023.01.08 |
JavaScript 배열을 선언할 때 "Array()"와 "[]"의 차이점은 무엇입니까? (0) | 2023.01.08 |
joomla 1.5 mariadb 10 (0) | 2023.01.08 |
Maria DB를 사용한 Larabel 6.x 마이그레이션 실패 (0) | 2023.01.08 |