Mysql, 긴/큰 데이터에서 넓은 데이터로 재구성
long/tall 형식의 mysql 테이블 데이터가 있는데(아래 설명) wide 형식으로 변환하고 싶습니다.sql만 사용해도 되나요?
예를 들어 설명하기 가장 쉽습니다.M개 국가, N개 키(예: 키는 소득, 정치 지도자, 지역, 대륙 등)에 대한 정보가 있다고 가정합니다.
Long format has 3 columns: country, key, value
- M*N rows.
e.g.
'USA', 'President', 'Obama'
...
'USA', 'Currency', 'Dollar'
Wide format has N=16 columns: county, key1, ..., keyN
- M rows
example:
country, President, ... , Currency
'USA', 'Obama', ... , 'Dollar'
SQL에서 와이드 포맷의 데이터로 새로운 테이블을 만들 수 있는 방법이 있습니까?
select distinct key from table;
// 이것으로 모든 열쇠를 얻을 수 있을 겁니다.
1) 그런 다음 이러한 주요 요소를 사용하여 표를 만드는 방법은 무엇입니까?
2) 그럼 표 값은 어떻게 기입하면 됩니까?
나는 어떤 스크립트 언어로도 이것을 할 수 있다고 꽤 확신하지만(나는 파이썬을 좋아한다), mysql에서 이것을 할 수 있는 쉬운 방법이 있는지 알고 싶었습니다.R 및 STATA와 같은 많은 통계 패키지에는 이 명령어가 내장되어 있는데, 이 명령어는 자주 사용되기 때문입니다.
======
좀 더 명확하게 설명하자면, 간단한 경우에 원하는 입력 출력은 다음과 같습니다.
입력:
country attrName attrValue key (these are column names)
US President Obama 2
US Currency Dollar 3
China President Hu 4
China Currency Yuan 5
산출량
country President Currency newPkey
US Obama Dollar 1
China Hu Yuan 2
교차 탭 또는 피벗 테이블이 정답입니다.여기서 ...에서 선택할 수 있습니다....에 삽입하거나 단일 선택에서 보기를 만듭니다.
다음과 같은 경우:
SELECT country,
MAX( IF( key='President', value, NULL ) ) AS President,
MAX( IF( key='Currency', value, NULL ) ) AS Currency,
...
FROM table
GROUP BY country;
SQL Server를 사용하는 경우 UNPIVOT를 사용하는 것이 쉽습니다.제가 아는 한, 이는 MySQL에 구현되어 있지 않기 때문에 이를 수행하려면 SQL을 동적으로 생성해야 할 것입니다(그리고 저는 이에 반대하는 것이 좋습니다). 이는 매우 번거롭습니다.
VIEWS와 INSERT INTO(e4c5에서 제시한 바와 같이)를 사용하는 솔루션을 찾은 것 같습니다.
본인이 직접 AtrNames/Key 목록을 가져와야 하는데, 다른 하나는 MYSQL에서 헤비리프팅을 합니다.
위의 간단한 테스트 케이스의 경우 적절한 열로 new_table을 작성합니다(자동 증분 기본 키를 가지는 것도 잊지 마십시오). 그런 다음
CREATE VIEW a
AS SELECT country, attrValue
WHERE attrName="President";
CREATE VIEW b
AS SELECT country, attrValue
WHERE attrName="Currency";
INSERT INTO newtable(country, President, Currency)
SELECT a.country, a.attrValue, b.attrValue
FROM a
INNER JOIN b ON a.country=b.country;
특성 이름이 더 있는 경우 각 보기에 대해 하나씩 만든 다음 마지막 문장을 그에 맞게 조정합니다.
INSERT INTO newtable(country, President, Currency, Capital, Population)
SELECT a.country, a.attrValue, b.attrValue, c.attrValue, d.attrValue
FROM a
INNER JOIN b ON a.country=b.country
INNER JOIN c ON a.country=c.country
INNER JOIN d ON a.country=d.country;
몇 가지 팁
- NATURAL Left JOIN을 사용하며 ON 절을 지정할 필요가 없습니다.
언급URL : https://stackoverflow.com/questions/2255640/mysql-reshape-data-from-long-tall-to-wide
'programing' 카테고리의 다른 글
입력 요소에는 자동 완성 속성이 있어야 합니다. (0) | 2023.10.14 |
---|---|
UIRepreshControl을 UIScrol View에서 사용할 수 있습니까? (0) | 2023.10.14 |
JS 파일 내 PHP 상수 (0) | 2023.10.14 |
Swift ios는 ios9 및 ios10에서 원격 푸시 알림이 활성화되어 있는지 확인합니다. (0) | 2023.10.14 |
WooCommerce는 가격이 아닌 날짜로만 주문하는 것 같습니다. (0) | 2023.10.14 |