[SQL] SQL 쿼리 결과에서 열 이름으로 열 값을 설정
SQLSQL 쿼리 결과에서 열 이름으로 열 값을 설정
나는 SQL 쿼리 결과의 열 이름이 될 것입니다 값이있는 테이블을 읽고 싶었다. 예를 들어, I는 표가 ..
id col1 col2
----------------------
0 name ax
0 name2 bx
0 name3 cx
1 name dx
1 name2 ex
1 name3 fx
당신이 ID = 0이 표시되면 이름은 도끼와 NAME2 IS BX 및 NAME3 IS CX의 값을 갖습니다. 대신이되는 행은 ID, 이름, NAME2, NAME3으로 열을 표시하는 것이 더 쉽습니다. 지금은 이런 모습에 쿼리의 결과를 원하는 :
id name name2 name3
0 ax bx cx
1 dx ex fx
이를 달성 캔 누군가의 도움이 나를?
해결법
-
==============================
1.이것은 피벗 테이블로 이루어집니다. ID로 그룹화, 당신은)는 MAX (같은 열 사용 뭔가 캡처 할 각 값에 대해 CASE 문을 발급 널 (null)을 제거하고 한 행 아래로 붕괴 집계.
이것은 피벗 테이블로 이루어집니다. ID로 그룹화, 당신은)는 MAX (같은 열 사용 뭔가 캡처 할 각 값에 대해 CASE 문을 발급 널 (null)을 제거하고 한 행 아래로 붕괴 집계.
SELECT id, /* if col1 matches the name string of this CASE, return col2, otherwise return NULL */ /* Then, the outer MAX() aggregate will eliminate all NULLs and collapse it down to one row per id */ MAX(CASE WHEN (col1 = 'name') THEN col2 ELSE NULL END) AS name, MAX(CASE WHEN (col1 = 'name2') THEN col2 ELSE NULL END) AS name2, MAX(CASE WHEN (col1 = 'name3') THEN col2 ELSE NULL END) AS name3 FROM yourtable GROUP BY id ORDER BY id
참고 :이 전용으로 작동 COL1에 사용할 수있는 값의 유한 알려진 숫자입니다. 가능한 값의 수를 알 수없는 경우, 당신은 루프에서 동적 SQL 문을 작성해야합니다.
-
==============================
2.당신이 할하려는 것은 당신이 CASE 및 집계 함수를 사용하여이를 복제 할 수 있도록 PIVOT MySQL은 피벗 기능이없는 것입니다.
당신이 할하려는 것은 당신이 CASE 및 집계 함수를 사용하여이를 복제 할 수 있도록 PIVOT MySQL은 피벗 기능이없는 것입니다.
당신이 열 알려진 번호가있는 경우에, 당신은 정적 버전과 하드 코드 값을 사용할 수 있습니다. 이 (데모와 참조 SQL 바이올린)와 유사 :
select id, max(case when col1='name' then col2 end) name, max(case when col1='name2' then col2 end) name2, max(case when col1='name3' then col2 end) name3 from yourtable group by id
당신이 열을 알 수없는 번호가 경우에, 당신은 준비된 문을 사용하여이 동적를 만들 수 있습니다 :
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when col1 = ''', col1, ''' then col2 end) AS ', col1 ) ) INTO @sql FROM yourtable; SET @sql = CONCAT('SELECT id, ', @sql, ' FROM yourtable GROUP BY id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
데모와 SQL 바이올린을 참조하십시오
-
==============================
3.
select id, max(if(tablename.columnname = 'name',tablename.columnname,null)) as namealise, max(if(tablename.columnname = 'name1',tablename.columnname,null)) as namealise1 from table1, table2 where table1.id = table2.id group by table1.id order by table1.id
from https://stackoverflow.com/questions/12808189/setting-column-values-as-column-names-in-the-sql-query-result by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 연결이 닫힐 때 어떤 커밋되지 않은 트랜잭션이 어떻게됩니까? (0) | 2020.04.20 |
---|---|
[SQL] 때 또는 당신이 오른쪽 외부를 사용하는 이유에 참여하는 대신 왼쪽? (0) | 2020.04.20 |
[SQL] SQL 서버에서 문자열을 분할 (0) | 2020.04.20 |
[SQL] SQL에서 널 문자 리터럴은 무엇인가? (0) | 2020.04.20 |
[SQL] 어떻게 MySQL의에서 SUM () BY ORDER에? (0) | 2020.04.20 |