복붙노트

[SQL] 어떻게 SQL 수평 데이터로 수직 데이터를 변환하는?

SQL

어떻게 SQL 수평 데이터로 수직 데이터를 변환하는?

그래서 같은 관련 항목의 번호와 테이블 "항목"이 :

ID   Rel_ID  Name  RelRank
---  ------  ----  -------
1    1       foo   1
2    1       bar   2
3    1       zam   3
4    2       foo2  1

저도 같은 Rel_ID와 항목과 같이, 같은 행에 나타납니다 있도록 쿼리를 얻으려고 :

Rel_ID  Name1  Name2  Name3
------  -----  -----  -----
1       foo    bar    zam
2       foo2

나는 테이블에 여러 번 선택 시도했다 :

SELECT k.Rel_ID, k.name 'Name1', k2.name 'Name2'
FROM item k, item k2
WHERE k.Rel_ID = k2.Rel_ID

하지만이 실패합니다. 확실히 대폭 과정을 단순화 할 수있는 변환 또는 쿼리가, 그리고 내가 전에 이런 식으로 SQL을 사용하지 않았기 때문에 난 그냥 누락하고 있습니다. 나는 무엇을 놓치고?

[편집 : 추가 RelRank 열, 않습니다 내 데이터에 표시]

해결법

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

    1.에 관계없이 사용중인 데이터베이스의, 당신이 달성하려고하는 일의 개념은 "피벗 테이블"라고합니다.

    에 관계없이 사용중인 데이터베이스의, 당신이 달성하려고하는 일의 개념은 "피벗 테이블"라고합니다.

    다음은 MySQL을위한 예입니다 : http://en.wikibooks.org/wiki/MySQL/Pivot_table

    일부 데이터베이스는 그것을 위해 기능이 내장되어, 아래의 링크를 참조하십시오.

    의 SQLServer : http://msdn.microsoft.com/de-de/library/ms177410.aspx

    신탁: http://www.dba-oracle.com/t_pivot_examples.htm

    당신은 항상 손으로 피벗을 만들 수 있습니다. 그냥 결과 집합의 모든 집계를 선택하고 그 결과 세트에서 선택합니다. 참고, 귀하의 경우, 당신은 CONCAT를 사용하여 하나 개의 컬럼에 모두 이름을 넣을 수 있습니다 (나는 생각 MySQL의에서의 GROUP_CONCAT), 당신은 A A rel_id 관련이 얼마나 많은 이름 모를 수 있기 때문이다.

    (내가 mysql을 모르는) 귀하의 경우에 의사 선택 :

    select rel_id, group_concat(name) from item group by rel_id
    
  2. ==============================

    2.난 당신이 MySQL의 특정 응답을 찾고있다 생각합니다. 구문이 다른 데이터 저장소마다 다를 수 있다는 점을 유의하시기 바랍니다.

    난 당신이 MySQL의 특정 응답을 찾고있다 생각합니다. 구문이 다른 데이터 저장소마다 다를 수 있다는 점을 유의하시기 바랍니다.

    MySQL은이 쉽게 기능이 있습니다.

    SELECT Rel_ID, GROUP_CONCAT(Name SEPARATOR ' ') As Names FROM Item GROUP BY Rel_ID;
    

    그 작동합니다 :-)

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

    3.당신이 목록에있는 이름이 정적 경우, 내 아래 쿼리는 내가 sqlfiddle 의지 작업을 성공적으로 실행하는 것이

    당신이 목록에있는 이름이 정적 경우, 내 아래 쿼리는 내가 sqlfiddle 의지 작업을 성공적으로 실행하는 것이

    SELECT rel_id,
    MAX (DECODE (rel_id, '1', DECODE (relrank, '1', name) , '2',DECODE (relrank, '1', name))) NAME1,
    MAX (DECODE (rel_id, '1', DECODE (relrank, '2', name))) NAME2,
    MAX (DECODE (rel_id, '1', DECODE (relrank, '3', name))) NAME3
    FROM supportContacts
    GROUP BY rel_id
    

    을 heres SQL 바이올린

    http://sqlfiddle.com/#!4/480e2/11

  4. from https://stackoverflow.com/questions/4071811/how-to-transform-vertical-data-into-horizontal-data-with-sql by cc-by-sa and MIT license