복붙노트

[SQL] SQL에서 두 행을 병합

SQL

SQL에서 두 행을 병합

나는 다음과 같은 정보를 포함하는 테이블이 있습니다 가정 :

FK | Field1 | Field2
=====================
3  | ABC    | *NULL*
3  | *NULL* | DEF

다음을 얻기 위해 나는 테이블에 선택을 수행 할 수있는 방법이

FK | Field1 | Field2
=====================
3  | ABC    | DEF

감사

편집 : 명확성을 위해 수정 FIELD2 이름

해결법

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

    1.집계 함수는 여기에 당신을 도울 수 있습니다. 집계 함수는 (SQL Server Express에 2008 R2에서 테스트)이 같은 쿼리를 사용할 수 있도록, (적어도 그 SQL 서버, 오라클, 그리고 제트 / 액세스에 사실) 널 (null)을 무시 :

    집계 함수는 여기에 당신을 도울 수 있습니다. 집계 함수는 (SQL Server Express에 2008 R2에서 테스트)이 같은 쿼리를 사용할 수 있도록, (적어도 그 SQL 서버, 오라클, 그리고 제트 / 액세스에 사실) 널 (null)을 무시 :

    SELECT
        FK,
        MAX(Field1) AS Field1,
        MAX(Field2) AS Field2
    FROM
        table1
    GROUP BY
        FK;
    

    나는 MAX를 사용하지만 행은 GROUP BY 중 하나 개의 값을 선택합니다 모든 집계가 작동합니다.

    테스트 데이터 :

    CREATE TABLE table1 (FK int, Field1 varchar(10), Field2 varchar(10));
    
    INSERT INTO table1 VALUES (3, 'ABC', NULL);
    INSERT INTO table1 VALUES (3, NULL, 'DEF');
    INSERT INTO table1 VALUES (4, 'GHI', NULL);
    INSERT INTO table1 VALUES (4, 'JKL', 'MNO');
    INSERT INTO table1 VALUES (4, NULL, 'PQR');
    

    결과 :

    FK  Field1  Field2
    --  ------  ------
    3   ABC     DEF
    4   JKL     PQR
    
  2. ==============================

    2.거기 포함되지 않은 몇 가지 데이터 규칙에 따라 몇 가지 방법이 있지만, 여기 당신이 준 것을 사용하는 하나의 방법이다.

    거기 포함되지 않은 몇 가지 데이터 규칙에 따라 몇 가지 방법이 있지만, 여기 당신이 준 것을 사용하는 하나의 방법이다.

    SELECT
        t1.Field1,
        t2.Field2
    FROM Table1 t1
        LEFT JOIN Table1 t2 ON t1.FK = t2.FK AND t2.Field1 IS NULL
    

    또 다른 방법:

    SELECT
        t1.Field1,
        (SELECT Field2 FROM Table2 t2 WHERE t2.FK = t1.FK AND Field1 IS NULL) AS Field2
    FROM Table1 t1
    
  3. ==============================

    3.나는 비슷한 문제가 있었다. 차이가 나는 내가 간단 명확 아니라 긴 쿼리 결국 수 있도록 반환 있었는지를 통해 훨씬 더 제어 할 필요가 있다고했다. 여기에 귀하의 예에 따라 그것의 단순화 된 버전입니다.

    나는 비슷한 문제가 있었다. 차이가 나는 내가 간단 명확 아니라 긴 쿼리 결국 수 있도록 반환 있었는지를 통해 훨씬 더 제어 할 필요가 있다고했다. 여기에 귀하의 예에 따라 그것의 단순화 된 버전입니다.

    select main.id, Field1_Q.Field1, Field2_Q.Field2
    from 
    (
        select distinct id
        from Table1
    )as main
    left outer join (
        select id, max(Field1)
        from Table1
        where Field1 is not null
        group by id
    ) as Field1_Q on main.id = Field1_Q.id
    left outer join (
        select id, max(Field2)
        from Table1
        where Field2 is not null
        group by id
    ) as Field2_Q on main.id = Field2_Q.id 
    ;
    

    여기 트릭 먼저 디스플레이 '주'선택을 행을 선택한다는 것이다. 그럼 당신은 하나의 필드 당을 선택합니다. 무엇에 결합되는 것은 '주'쿼리에 의해 반환 된 같은 값을 모두해야한다.

    경고, 그 다른 쿼리는 ID 당 하나의 행을 반환해야하거나 데이터를 무시 될 것이다

  4. ==============================

    4.이 깔끔한 방법이 될 수 있지만 다음과 같은 하나 개의 방법이 될 수있다 :

    이 깔끔한 방법이 될 수 있지만 다음과 같은 하나 개의 방법이 될 수있다 :

    SELECT    t.fk,
              (
                 SELECT t1.Field1 
                 FROM   `table` t1 
                 WHERE  t1.fk = t.fk AND t1.Field1 IS NOT NULL
                 LIMIT  1
              ) Field1,
              (
                 SELECT t2.Field2
                 FROM   `table` t2 
                 WHERE  t2.fk = t.fk AND t2.Field2 IS NOT NULL
                 LIMIT  1
              ) Field2
    FROM      `table` t
    WHERE     t.fk = 3
    GROUP BY  t.fk;
    

    테스트 케이스 :

    CREATE TABLE `table` (fk int, Field1 varchar(10), Field2 varchar(10));
    
    INSERT INTO `table` VALUES (3, 'ABC', NULL);
    INSERT INTO `table` VALUES (3, NULL, 'DEF');
    INSERT INTO `table` VALUES (4, 'GHI', NULL);
    INSERT INTO `table` VALUES (4, NULL, 'JKL');
    INSERT INTO `table` VALUES (5, NULL, 'MNO');
    

    결과:

    +------+--------+--------+
    | fk   | Field1 | Field2 |
    +------+--------+--------+
    |    3 | ABC    | DEF    |
    +------+--------+--------+
    1 row in set (0.01 sec)
    

    를 Where t.fk = 3 절없이 동일한 쿼리를 실행하면, 다음과 같은 결과 집합을 반환합니다 :

    +------+--------+--------+
    | fk   | Field1 | Field2 |
    +------+--------+--------+
    |    3 | ABC    | DEF    |
    |    4 | GHI    | JKL    |
    |    5 | NULL   | MNO    |
    +------+--------+--------+
    3 rows in set (0.01 sec)
    
  5. ==============================

    5.한 행은 필드 1 열 및 다른 행에 값이있는 경우는 null 값이 쿼리 힘의 일이.

    한 행은 필드 1 열 및 다른 행에 값이있는 경우는 null 값이 쿼리 힘의 일이.

    SELECT
      FK,
      MAX(Field1) as Field1,
      MAX(Field2) as Field2
    FROM 
    (
    select FK,ISNULL(Field1,'') as Field1,ISNULL(Field2,'') as Field2 from table1
    )
    tbl
    GROUP BY FK
    
  6. ==============================

    6.내 경우에는 내가이 같은 테이블이 있습니다

    내 경우에는 내가이 같은 테이블이 있습니다

    ---------------------------------------------
    |company_name|company_ID|CA        |   WA   |
    ---------------------------------------------
    |Costco      |   1      |NULL      | 2      |
    ---------------------------------------------
    |Costco      |   1      |3         |Null    |
    ---------------------------------------------
    

    그리고 나는 그것이 아래와 같이 할 것을 권장합니다

    ---------------------------------------------
    |company_name|company_ID|CA        |   WA   |
    ---------------------------------------------
    |Costco      |   1      |3         | 2      |
    ---------------------------------------------
    

    대부분의 코드는 거의 동일합니다 :

    SELECT
        FK,
        MAX(CA) AS CA,
        MAX(WA) AS WA
    FROM
        table1
    GROUP BY company_name,company_ID
    

    당신이 그것으로 두 개의 열 이름을 넣어 경우 유일한 차이점은 그룹화 쌍의 수,에 의해 그룹입니다.

  7. from https://stackoverflow.com/questions/2941116/merge-two-rows-in-sql by cc-by-sa and MIT license