복붙노트

[SQL] 열에 피벗 행 집계하지 않고

SQL

열에 피벗 행 집계하지 않고

어떻게 동적 피벗 SQL 문을 작성하는 내려고. TEST_NAME는 12 개까지의 값을 가질 수있는 경우 (따라서 12 열을 가짐). VAL 중 일부는 INT, 진수, 또는 VARCHAR 데이터 유형이 될 것입니다. 내가 본 대부분의 예제가 포함 골재의 일부를 가지고있다. 나는 직선 값 피벗에 대한 찾고 있어요.

Source Table 

╔═══════════╦══════╦═══════╗
║ TEST_NAME ║ SBNO ║  VAL  ║
╠═══════════╬══════╬═══════╣
║ Test1     ║    1 ║ 0.304 ║
║ Test1     ║    2 ║ 0.31  ║
║ Test1     ║    3 ║ 0.306 ║
║ Test2     ║    1 ║ 2.3   ║
║ Test2     ║    2 ║ 2.5   ║
║ Test2     ║    3 ║ 2.4   ║
║ Test3     ║    1 ║ PASS  ║
║ Test3     ║    2 ║ PASS  ║
╚═══════════╩══════╩═══════╝


Desired Output 
╔══════════════════════════╗
║ SBNO Test1 Test2   Test3 ║
╠══════════════════════════╣
║ 1    0.304  2.3    PASS  ║
║ 2    0.31   2.5    PASS  ║
║ 3    0.306  2.4    NULL  ║
╚══════════════════════════╝

해결법

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

    1.피벗 기능이 작동하도록하기 위해 통합이 필요합니다. 당신의 발 열 당신이 중 하나를 MAX 또는 MIN 집계 함수를 사용해야합니다 있도록 VARCHAR가 나타납니다.

    피벗 기능이 작동하도록하기 위해 통합이 필요합니다. 당신의 발 열 당신이 중 하나를 MAX 또는 MIN 집계 함수를 사용해야합니다 있도록 VARCHAR가 나타납니다.

    테스트의 수는 제한되어있는 경우, 당신은 하드 코드 값을 할 수 있습니다

    select sbno, Test1, Test2, Test3
    from
    (
      select test_name, sbno, val
      from yourtable
    ) d
    pivot
    (
      max(val)
      for test_name in (Test1, Test2, Test3)
    ) piv;
    

    데모와 SQL 바이올린을 참조하십시오.

    당신의 OP에서, 당신은 당신이 열로 설정하는 행의 많은 수있을 것이라는 점을 밝혔다. 이런 경우, 당신은 동적 SQL을 사용할 수 있습니다 :

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME) 
                        from yourtable
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT sbno,' + @cols + '
                 from 
                 (
                    select test_name, sbno, val
                    from yourtable
                ) x
                pivot 
                (
                    max(val)
                    for test_name in (' + @cols + ')
                ) p '
    
    execute(@query)
    

    데모와 SQL 바이올린을 참조하십시오.

    두 버전 모두 같은 결과를 줄 것이다 :

    | SBNO | TEST1 | TEST2 |  TEST3 |
    ---------------------------------
    |    1 | 0.304 |   2.3 |   PASS |
    |    2 |  0.31 |   2.5 |   PASS |
    |    3 | 0.306 |   2.4 | (null) |
    
  2. ==============================

    2.집계하지 않고 PIVOT 수있는 방법이 전혀 없습니다.

    집계하지 않고 PIVOT 수있는 방법이 전혀 없습니다.

    CREATE TABLE #table1
    (
        TEST_NAME VARCHAR(10),
        SBNO VARCHAR(10),
        VAL VARCHAR(10)
    );
    
    INSERT INTO #table1 (TEST_NAME, SBNO, VAL)
    VALUES ('Test1' ,'1', '0.304'),
           ('Test1' ,'2', '0.31'),
           ('Test1' ,'3', '0.306'),
           ('Test2' ,'1', '2.3'),
           ('Test2' ,'2', '2.5'),
           ('Test2' ,'3', '2.4'),
           ('Test3' ,'1', 'PASS'),
           ('Test3' ,'2', 'PASS')
    
    WITH T AS
    (
        SELECT SBNO, VAL, TEST_NAME    
          FROM #table1
    ) 
    SELECT *
      FROM T
     PIVOT (MAX(VAL) FOR TEST_NAME IN([Test1], [Test2], [Test3])) P
    
  3. ==============================

    3.해결 방법은 의무 집계는 오직 하나의 레코드에 적용되도록 할 수 있습니다. Excel에서 예를 들어 출력이 될 수있다 :

    해결 방법은 의무 집계는 오직 하나의 레코드에 적용되도록 할 수 있습니다. Excel에서 예를 들어 출력이 될 수있다 :

    여기서 행은 라벨 하단에 고유 인덱스 번호가 세포의 열이 포함되어 있습니다.

  4. from https://stackoverflow.com/questions/15674373/pivot-rows-to-columns-without-aggregate by cc-by-sa and MIT license