2017-02-05 5 views
0

저는 완전히 새로운 MySQL입니다. 여기에 mysql에서 열 col1을 해당 범주 (col2)를 기반으로 4 개의 다른 열로 나눕니다 (아래 그림 참조). 나는 지금까지이 같은 쿼리를 작성했습니다 :이 코드는 나에게 네 개의 열을 제공하지만 더이를 필터링 할 수없는 나처럼 지금 붙어mysql의 열을 여러 열로 나눕니다.

select if(category = 'first',name ,NULL) as first, 
if(category = 'second',name,NULL) as second, 
if(category = 'third',name,NULL) as third, 
if(category = 'fourth',name,NULL) as fourth 
from 'table'; 

.

을 감안할 때 테이블 :

name  category 
John  first 
Sunil third 
Jenny third 
Ashley fourth 
Meera second 
Abhay first 

필수 답 : 답의 모든 열이 분류되어

col1 col2 col3 col4 
Abhay Meera Jenny Ashley 
John NULL Sunil NULL 

참고.

편집 : 궁금한 점은 최종 답변 형식이 명확하지 않은 것 같습니다. 지적 해 주셔서 감사합니다 @ philipxy. 최종 답변은 최소한 행 수 (이 경우 2)로 조정해야합니다. 모든 열의 수가 같은 수의 열이어야하며 일부 열의 값이 더 작은 경우 해당 행의 값은 NULL입니다 (예 : col2col 4). NULL는 (있는 경우) 예컨대을 마지막에있을이 나타납니다 다음 categoryfourthOlly라는 항목이 있었다 가정 할 경우 마지막으로 모든 열이 정렬 된 순서에 있어야 col4에서 NULLAshley 후 전에.

+0

출력은 2 행만 필요하다고 가정합니까? 또는 원본 테이블의 행 수에 따라 더 많을 수 있습니까? – Yousaf

+0

행이 더있을 수 있습니다. 여기에 한 가지 예가 나와 있습니다. –

+0

왜이 작업을 수행하려고합니까? 이것은 테이블의 행에 값이 GUI 격자 인 것처럼 강제 실행됩니다. 당신은 아마 SQL 테이블에서 포맷하지 않아야합니다, 당신은 GUI에서 포맷해야합니다. "선택 t. *"이 무엇인지 모르는 것을 고려하십시오. 당신은 거의 확실하게 당신이 요구하는 결과를 원하지 않습니다. – philipxy

답변

1

이것은 까다 롭습니다. 목록을 가로로 쌓아 가려고하는데, 이것은 "일반적인"SQL 작업이 아닙니다.

조건부 집계를 사용하여 원하는 것을 할 수 있습니다. 문제는 집계 할 것이 없다는 것입니다. 각 열에서 특정 순서로 값을 원하는 경우,

select max(case when category = 'first' then name end) as first, 
     max(case when category = 'second' then name end) as second, 
     max(case when category = 'third' then name end) as third, 
     max(case when category = 'fourth' then name end) as fourth 
from (select t.*, 
      (@rn := if(@c = category, @rn + 1, 
         if(@c := category, 1, 1) 
         ) 
      ) as rn 
     from `table` t cross join 
      (select @c := '', @rn := 0) params 
     order by category 
    ) t 
group by rn; 

category 후 두 번째 정렬 키를 추가 :이 솔루션은 통합에 대한 일련 번호를 계산하는 변수 열을 소개하는 것입니다.

편집 :

난 당신이 여러 행 있었으나 결국 값이 필요하지 않은 경우, 당신은 그들을 함께 연결할 수 있음을 유의

:

select group_concat(case when category = 'first' then name end) as firsts, 
     group_concat(case when category = 'second' then name end) as seconds, 
     group_concat(case when category = 'third' then name end) as thirds, 
     group_concat(case when category = 'fourth' then name end) as fourths 
from`table` t 
group by rn; 
+0

코드에서 변수가 사용되는 논리를 설명해 주시겠습니까? 또한이 부분을 이해하지 못합니다 :'select t. *''t. * '는 무엇입니까? –

+0

@SunilKumar. . 't'는 테이블 별칭입니다. 설명서에서 사용자 정의 변수에 대해 학습합니다 (https://dev.mysql.com/doc/refman/5.7/en/user-variables.html). 이 쿼리에서 어떻게 작동하는지 보려면 하위 쿼리를 단독으로 실행하십시오. –

+0

FROM을 사용하여 ORDER BY 순서로 표현식을 포함하기 전에 subselect를 사용하여 각 행에 대한 변수 할당을 실행하는 SELECT에있는 변수에 대한 할당을 정의하는 MySQL (또는 * 모든 * SQL DBMS) 사양을 알려주십시오. 이 답변이이 질문에 대한 해결책이라는 귀하의 주장은 링크 된 문서에 다소 암시적인 어구가 있지만이 의미는 어디에도 기록되어 있지 않습니다. – philipxy

0

select if(category = 'first',name ,NULL) as first, 
if(category = 'second',name,NULL) as second, 
if(category = 'third',name,NULL) as third, 
if(category = 'fourth',name,NULL) as fourth 
from table1 ORDER BY name; 

시도 출력

| first | second | third | fourth | 
|--------|--------|--------|--------| 
| Abhay | (null) | (null) | (null) | 
| (null) | (null) | (null) | Ashley | 
| (null) | (null) | Jenny | (null) | 
| John | (null) | (null) | (null) | 
| (null) | Meera | (null) | (null) | 
| (null) | (null) | Sunil | (null) | 
+0

나는이 부분까지했다. 사실 주어진 형식으로 만 대답해야합니다. 주어진 형식으로 –

+0

, 당신은 단지 2 행을 의미합니까? – Yousaf

+0

은 Null 값이 최소 횟수 발생하고 정렬 된 순서로 모든 이름 뒤에 나타나도록 열을 조정해야한다는 것을 의미합니다. –

관련 문제