복붙노트

[SQL] 넓은 키가 큰 MySQL의 긴에서 모양 변경 데이터 /

SQL

넓은 키가 큰 MySQL의 긴에서 모양 변경 데이터 /

나는 긴에서 MySQL의 테이블에 데이터가 / 높이 형식 (아래 설명) 및 와이드 포맷으로 변환 할 수 있습니다. 난 그냥 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) 방법은 다음 테이블 값을 입력합니까?

나는 확신 내가 어떤 스크립트 언어 (I 파이썬 등)로이 작업을 수행 할 수 있습니다 해요,하지만 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

해결법

  1. ==============================

    1.크로스 탭 또는 피벗 테이블 대답이다. 거기에서 당신은 FROM ... INSERT INTO SELECT ... 또는 단일 SELECT에서보기를 만들 수 있습니다.

    크로스 탭 또는 피벗 테이블 대답이다. 거기에서 당신은 FROM ... INSERT INTO SELECT ... 또는 단일 SELECT에서보기를 만들 수 있습니다.

    뭔가 같은 :

    SELECT country, 
           MAX( IF( key='President', value, NULL ) ) AS President,
           MAX( IF( key='Currency', value, NULL ) ) AS Currency,
           ...
    
    FROM table 
    GROUP BY country;
    

    추가 정보를 원하시면 : http://dev.mysql.com/tech-resources/articles/wizard/index.html

  2. ==============================

    2.나는 (e4c5에 의해 제안)보기 및 INSERT INTO를 사용하는 솔루션을 찾은 것 같아요.

    나는 (e4c5에 의해 제안)보기 및 INSERT INTO를 사용하는 솔루션을 찾은 것 같아요.

    당신은 / 키 자신을 AttrNames의 목록을 얻을해야하지만, 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;
    

    더 attrNames이있는 경우, 각 하나 하나 개의보기를 작성하고 그에 따라 마지막 문을 조정합니다.

    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;
    

    좀 더 팁

  3. ==============================

    3.당신은 SQL Server를 사용한다면,이 UNPIVOT을 사용하여 쉽게 될 것이다. 내가 알고 마찬가지로 지금까지, 이것은 당신이 (내가 반대 좋을 걸) 당신은 아마 동적 SQL을 생성 할 수 있고,의 지저분한 그 것이다이 작업을 수행 할 수 있도록하면, MySQL에서 구현되지 않습니다.

    당신은 SQL Server를 사용한다면,이 UNPIVOT을 사용하여 쉽게 될 것이다. 내가 알고 마찬가지로 지금까지, 이것은 당신이 (내가 반대 좋을 걸) 당신은 아마 동적 SQL을 생성 할 수 있고,의 지저분한 그 것이다이 작업을 수행 할 수 있도록하면, MySQL에서 구현되지 않습니다.

  4. from https://stackoverflow.com/questions/2255640/mysql-reshape-data-from-long-tall-to-wide by cc-by-sa and MIT license