programing

Mysql, 긴/큰 데이터에서 넓은 데이터로 재구성

telebox 2023. 10. 14. 10:04
반응형

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

반응형