programing

SQL ID는 같지만 열 값이 다른 두 행 병합(Oracle)

stoneblock 2023. 9. 11. 21:25

SQL ID는 같지만 열 값이 다른 두 행 병합(Oracle)

id는 같지만 column 값이 다를 때 다른 행을 하나로 병합하려고 합니다.

예를 들어 다음과 같습니다.

    (table1)

    id       colour

    1        red
    1        blue
    2        green
    2        red

결과가 다음과 같이 되도록 이것을 결합했으면 합니다.

    id     colour1    colour2

    1      red        blue
    2      green      red

아니면

    id     colour

    1      red, blue
    2      green, red

또는 행이 함께 결합되도록 위의 다른 변형.

어떤 도움이라도 주시면 감사하겠습니다!미리 감사드립니다.

먼저 제 의견을 읽어보세요. 보고 목적이 아니면 이 작업을 수행할 생각조차 하지 않으셔도 됩니다. 그리고 이 작업을 수행하기 위해 보고 도구를 사용하는 올바른 솔루션이 아닌 일반 SQL에서 수행할 수 있는 방법을 알고 싶으실 것입니다.

두 번째 형식이 가장 쉽습니다. 특히 색상이 나타나는 순서에 상관없이 사용할 수 있는 경우에는 더욱 그렇습니다.

select   id, listagg(colour, ', ') within group (order by null)
from     table1
group by id

order by null랜덤 순서를 의미합니다.다른 것으로 주문하고 싶다면, 그것을 사용하세요.order by와 함께listagg(). 예를 들어, 색상을 알파벳순으로 순서를 정하면 다음과 같이 말할 수 있습니다.within group (order by colour).

첫 번째 형식의 경우 열 수에 대한 선험적 제한이 있어야 하며, 사용하는 방법은 사용 중인 Oracle 버전에 따라 다릅니다(여기에 게시하는 모든 질문과 다른 토론 게시판에 항상 포함해야 함).이 개념은 "pivoting"이라고 불리는데, 버전 11 이후 Oracle에는 사용자가 사용할 수 있는 명시적인 피벗 연산자가 있습니다.

다음은 당신이 제안한 두 가지 방법 중 첫 번째 방법으로 당신의 문제를 해결해 줄 것입니다.Listagg는 두 가지 방법 중 두 번째 방법으로 해결하는 데 사용하는 방법입니다(다른 답변에서 지적된 바와 같이).

select    id,
          min(decode(rn,1,colour,null)) as colour1,
          min(decode(rn,2,colour,null)) as colour2,
          min(decode(rn,3,colour,null)) as colour3
from (
      select id,
             colour,
             row_number() over(partition by id order by colour) as rn 
      from   table1
     )
group by  id;

이 방법에서는 특정 ID에 대해 가능한 최대 색상 수까지 대소문자를 추가해야 합니다(이 솔루션은 동적이 아님).

또한 색상 이름의 알파벳 순서에 따라 색상 1, 색상 2 등에 색상을 입력하는 것입니다.만약 당신이 임의의 주문이나 다른 주문을 선호한다면, 당신은 변경할 필요가 있습니다.order by.

해봐요, 저한테 효과가 있어요.

여기서student테이블의 이름이고.studentId는 열입니다.우리는 모든 과목을 특정 학생에게 병합할 수 있습니다.GROUP_CONCAT.

SELECT studentId, GROUP_CONCAT(subjects) FROM student

언급URL : https://stackoverflow.com/questions/40831690/sql-merge-two-rows-with-same-id-but-different-column-values-oracle