복붙노트

[SQL] SQL의 모든 열 값 CONCAT

SQL

SQL의 모든 열 값 CONCAT

어떻게 하나 개의 값으로 SQL 쿼리에서 반환 된 다른 행의 모든 ​​열 값을 CONCAT하는? 이 예입니다 :

쿼리 반환 :

FOO
------
RES1

RES2

RES3

지금은 다음과 같은 결과를 갖고 싶어 :

FOOCONCAT
-----
RES1RES2RES3

SQL에서이 작업을 수행하기 위해 어떤 방법이 있습니까?

해결법

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

    1.SQL 서버의 경우 :

    SQL 서버의 경우 :

    SELECT  col1 AS [text()]
    FROM    foo
    FOR XML PATH ('')
    

    MySQL은 :

    SELECT  GROUP_CONCAT(col1 SEPARATOR '')
    FROM    foo
    

    PostgreSQL의에서 :

    SELECT  array_to_string
            (
            ARRAY
            (
            SELECT  col1
            FROM    foo
            ), ''
            )
    

    오라클의 경우 :

    SELECT  *
    FROM    (
            SELECT  col1, ROW_NUMBER() OVER(ORDER BY 1) AS rn
            FROM    foo
            MODEL
            DIMENSION BY
                    (rn)
            MEASURES
                    (col1, col1 AS group_concat, 0 AS mark)
            RULES UPDATE (
                    group_concat[rn > 1] =  group_concat[CV() - 1] || col1[CV()],
                    mark[ANY] = PRESENTV(mark[CV() + 1], 0, 1)
                    )
            )
    WHERE   mark = 1
    
  2. ==============================

    2.Quassnoi의 오라클 솔루션은 매우 인상적이다,하지만 난 간단 SYS_CONNECT_BY_PATH를 사용하는 것 ()보다는 모델의 마법을 발견했다.

    Quassnoi의 오라클 솔루션은 매우 인상적이다,하지만 난 간단 SYS_CONNECT_BY_PATH를 사용하는 것 ()보다는 모델의 마법을 발견했다.

    SELECT REPLACE(MAX(SYS_CONNECT_BY_PATH(foo, '/')), '/', '') conc
    FROM (
        SELECT T_FOO.*, ROW_NUMBER() OVER (ORDER BY FOO) R FROM T_FOO
    )
    START WITH r=1
    CONNECT BY PRIOR r = r-1;
    
  3. ==============================

    3.MySQL의 방법 :

    MySQL의 방법 :

    select group_concat(somecolumn separator '') from sometable
    
  4. ==============================

    4.그것은 여러 값을 하나 개의 컬럼 있다고 가정하면,이 방법은 (내가 다른 시스템에 대해 말할 수 없다) MS SQL 서버에 적용됩니다.

    그것은 여러 값을 하나 개의 컬럼 있다고 가정하면,이 방법은 (내가 다른 시스템에 대해 말할 수 없다) MS SQL 서버에 적용됩니다.

    declare @result varchar(max)
    set @result = ''
    
    select @result = @result + RES
    from (query goes here)
    
  5. ==============================

    5.여기에 당신이 찾고있는 대답은, 나는이 솔루션은 CONNECT BY 작업에 누워 느낌을했다, 난 그냥 전에 SYS_CONNECT_BY_PATH 의사 열을 사용하지 않았다 (이 표시 트리에서 노드의 전체 경로는 "/"로 노드 이름을 분리). 가정 당신의 "foo는"값이 이전 예컨대 열 "의 mykey"로 그룹화 테이블의 여러 행입니다 세트 :

    여기에 당신이 찾고있는 대답은, 나는이 솔루션은 CONNECT BY 작업에 누워 느낌을했다, 난 그냥 전에 SYS_CONNECT_BY_PATH 의사 열을 사용하지 않았다 (이 표시 트리에서 노드의 전체 경로는 "/"로 노드 이름을 분리). 가정 당신의 "foo는"값이 이전 예컨대 열 "의 mykey"로 그룹화 테이블의 여러 행입니다 세트 :

    myKey    foo
    -------- ----------
    group 1  apple
    group 1  orange
    group 1  pear
    group 2  ape
    group 2  bear
    group 2  kitten
    

    당신은 나무 스키마 것처럼 데이터를 처리하고, 각 그룹의 값이 지점 아래로가는 노드를 대표하는 척 할 수 있습니다. 이 경우, 당신은이 작업을 수행 할 것입니다 :

      SELECT myKey
           , SUBSTR(MAX(REPLACE(SYS_CONNECT_BY_PATH(foo, '/')
                               ,'/'
                               ,' '
                               )
                       )
                   ,2
                   ) FooConcat
        FROM ( SELECT MyKey
                    , Foo
                    , row_number() OVER (Partition by myKey order by myKey) NodeDepth
                 FROM MyTable
             )
       START WITH NodeDepth = 1
     CONNECT BY PRIOR myKey = myKey
         AND PRIOR NodeDepth = NodeDepth -1
    GROUP BY myKey
    ;
    

    물론, 연결된 값의 순서는 무작위 것; 테이블이 다른 열 당신이 주문 상승 된 필드와 연속으로 사용할 수 있다는 것을 ( "바")가 있다면, 당신은 하위 쿼리와 분배 (만 나무에 가상의 깊이를 넣어 존재하는) 직접 테이블을 사용할 수 있습니다, 바 NodeDepth 교체.

  6. ==============================

    6.편집 : 버전 8.4.0 CUBRID는 MySQL과 90 %의 호환성을 제공하기 때문에. 따라서, MySQL은 유사한 구문 GROUP_CONCAT을 지원

    편집 : 버전 8.4.0 CUBRID는 MySQL과 90 %의 호환성을 제공하기 때문에. 따라서, MySQL은 유사한 구문 GROUP_CONCAT을 지원

    CREATE TABLE t(i int);
    INSERT INTO t VALUES (4),(2),(3),(6),(1),(5);
    
    SELECT GROUP_CONCAT(i*2+1 ORDER BY 1 SEPARATOR '') FROM t;
    
    group_concat(i*2+1 order by 1 separator '')
    ======================
      '35791113'
    

    아주 강력하고, 그렇지? 그리고 아래 CUBRID에서 기본적으로 지원되는 대체 솔루션입니다.

    SELECT MAX(SYS_CONNECT_BY_PATH(s_name, '')) AS conc_s_name
    FROM (
         SELECT ROWNUM AS r, s_name FROM code
    ) AS res
    START WITH r = 1
    CONNECT BY PRIOR r = r - 1;
    

    그것은 @devio에 의해 제공 CUBRID에서 다른 행의 열 값을 연결의 방법은 오라클의 방법과 거의 동일 너무 재미있다. CUBRID에서는 조금 더 쉽게 생각 보인다.

  7. ==============================

    7.

    select cast(res1 as varchar)+cast(res2 as varchar)+cast(res3 as varchar) as fooconcat from foo
    

    당신이 캐스트가 필요하지 않습니다 열이 이미 문자열이 있다면, 당신은 할 수 있습니다 :

    select res1 + res2 + res3  as fooconcat from foo
    

    여러 행, 사용 PIVOT의 데이터를하십시오.

  8. ==============================

    8.문자열을 연결하면 (당신이 간다 그래서 여기에 질문의 버전을 언급하지 않은) 사용중인 데이터베이스에 따라 달라집니다 ...

    문자열을 연결하면 (당신이 간다 그래서 여기에 질문의 버전을 언급하지 않은) 사용중인 데이터베이스에 따라 달라집니다 ...

    Oracle 및 DB2에서 당신은 CONCAT 기능 ... CONCAT을 사용할 수 있습니다 (문자열, 문자열)

    SQL 서버는 당신이 '+'연산자를 사용할 수 있습니다 ... 문자열 1 + 문자열 2 + string3

    MySQL의에서이 CONCAT입니다 (문자열, 문자열 ... n_string)

    마지막으로 PostgreSQL의에서이 TEXTCAT (문자열, 문자열)입니다 ...

    ... 나는 그것을 확인 ... 난 내 책상 오라일리에서 SQL 포켓 가이드에 앉아있는이 작은 멋진 책이 밖으로있어!

    :)

  9. ==============================

    9.그것은 당신이 찾고있는,하지만이 같은 구조와 과거에 행운을 했어 무엇을하지 않을 수 있습니다 :

    그것은 당신이 찾고있는,하지만이 같은 구조와 과거에 행운을 했어 무엇을하지 않을 수 있습니다 :

    SELECT      MAX(DECODE(fookey, 1, foo, NULL))
             || MAX(DECODE(fookey, 2, foo, NULL))
             || MAX(DECODE(fookey, 3, foo, NULL))
             || MAX(DECODE(fookey, 4, foo, NULL))
           , groupingvalue
        FROM mytable
    GROUP BY groupingvalue;
    

    그것의 플랫폼 독립적 인, 그리고 당신은 임의의가 있지만 foo는 값의 수를 제한 할 때 잘 작동하고는 다른 키 값을 기반으로하고 있습니다. 당신이 청구서의 테이블을 가지고 있고, 당신이 연결된 단일 행에 송장의 모든 라인의 시간을보고 싶어, 당신은 5 개 라인 항목의 상한이있는 경우 예를 들어, 그 결과는 다음과 같습니다

    SELECT      MAX(DECODE(lineno, 1, foo, NULL))
             || ', '
             || MAX(DECODE(lineno, 2, foo, NULL))
             || ', '
             || MAX(DECODE(lineno, 3, foo, NULL))
             || ', '
             || MAX(DECODE(lineno, 4, foo, NULL))
             || ', '
             || MAX(DECODE(lineno, 5, foo, NULL))
           , invoiceid
        FROM lineitem
    GROUP BY invoiceid;
    
  10. ==============================

    10.SQL 서버 2008 R2 :

    SQL 서버 2008 R2 :

    declare @ColumnNameList VARCHAR(MAX)
    
    
     SELECT @ColumnNameList  = COALESCE(@ColumnNameList +',' ,'') + ColumnName 
                         FROM 
                           <<table name>>
    
    select @ColumnNameList 
    
  11. ==============================

    11.나는 T-SQL에서 하나의 VARCHAR 문자열로 쿼리에 의해 반환 된 열에서 모든 기록을 연결하는 방법에 대한 해답을 찾았나요?

    나는 T-SQL에서 하나의 VARCHAR 문자열로 쿼리에 의해 반환 된 열에서 모든 기록을 연결하는 방법에 대한 해답을 찾았나요?

    declare @s varchar(8000)
    select @s = coalesce(@s + col, col) from tbl
    

    이 해결한다

  12. ==============================

    12.선택 ([COL1] + ','+ [COL2] + ','+ [COL3] + ','+ [col4]) MyCol]로서 [표]에서

    선택 ([COL1] + ','+ [COL2] + ','+ [COL3] + ','+ [col4]) MyCol]로서 [표]에서

  13. from https://stackoverflow.com/questions/970481/concat-all-column-values-in-sql by cc-by-sa and MIT license