복붙노트

[SQL] 아마도 SQL 서버 PIVOT?

SQL

아마도 SQL 서버 PIVOT?

SELECT 이름 1은, NAME2, MYTABLE FROM 값은 나에게 다음과 같은 결과 집합을 제공합니다 :

Name1 Name2 Value
A     P1     1
A     P2     1
A     P3     2
B     P1     3
B     P2     1
B     P4     1

나는 그것을 번역 할 방법 :

       A     B
P1     1     4
P2     1     1
P3     2     null
P4     null  1

감사,

해결법

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

    1.당신은 PIVOT 절을 사용할 수 있습니다. 귀하의 질의는 다음과 같이 될 수있다 :

    당신은 PIVOT 절을 사용할 수 있습니다. 귀하의 질의는 다음과 같이 될 수있다 :

    WITH Source as (
        SELECT Name1, Name2, [Value]
        FROM mytable 
    )
    
    SELECT Name2, CASE WHEN A IS NOT NULL THEN A ELSE 'your string' END As A
    , CASE WHEN B IS NOT NULL THEN B ELSE 'your string' END As B
    FROM (
            SELECT Name2, Name1, [Value]
            FROM Source
    ) s
    PIVOT 
    (
        MAX([Value]) FOR Name1 IN (A, B) -- any other Name1 would go here
    ) p
    

    위의 샘플 데이터를 사용하여 내 결과는

    P1  1           3
    P2  1           1
    P3  2           your string
    P4  your string 1
    

    편집하다:

    당신이 열을 알 수없는 번호를 가지고 있기 때문에, 당신은 동적 SQL을 사용하여 볼 필요하고 몇 가지 답변은 PIVOT과 그것에 대해 SO 여기에있다.

    열의 알 수없는 번호에 SQL Server 2005의 피벗

    피벗 테이블과 연결하여 열

  2. ==============================

    2.SQL Server 2005를 사용하고 있기 때문에, 여기에 코드입니다 :

    SQL Server 2005를 사용하고 있기 때문에, 여기에 코드입니다 :

    DECLARE @cols VARCHAR(1000)
    DECLARE @sqlquery VARCHAR(2000)
    
    SELECT  @cols = STUFF(( SELECT distinct  ',' + QuoteName([Name1])
                            FROM myTable FOR XML PATH('') ), 1, 1, '') 
    
    
    SET @sqlquery = 'SELECT * FROM
          (SELECT Name2, Name1, Value
           FROM myTable ) base
           PIVOT (Sum(Value) FOR [Name1]
           IN (' + @cols + ')) AS finalpivot'
    
    EXECUTE ( @sqlquery )
    

    이 상관없이 당신이 얼마나 많은 다른 상태 작동하지 않습니다. 동적으로 PIVOT과 쿼리를 어셈블합니다. 동적 열이 PIVOT을 할 수있는 유일한 방법은 SQL 서버에서 수행 할 수 동적으로 쿼리를 조립하는 것입니다.

    다른 예 :

  3. ==============================

    3.나는 SQL 서버가 수도하지 않음으로써이 때문에 직장에서 여기에 실행하지 않아도 완전히 syntatically 올바른하지만 한 가지 방법은 교차 표 것

    나는 SQL 서버가 수도하지 않음으로써이 때문에 직장에서 여기에 실행하지 않아도 완전히 syntatically 올바른하지만 한 가지 방법은 교차 표 것

    SELECT name2
         , SUM(CASE WHEN name1 = 'A' THEN value END) AS A
         , SUM(CASE WHEN name1 = 'B' THEN value END) AS B
    FROM table
    GROUP BY name2
    

    컬럼의 변수 번호는 당신이 동적 SQL을 사용할 수 있습니다 :

    DECLARE @sql varchar(max)
    SELECT @sql = COALESCE(@sql+',','') + 'SUM(CASE WHEN nane1 = '''+name1+''' THEN value END) AS ['+name1']' FROM table
    
    SET @sql = 'SELECT name2, '+@sql+' FROM table GROUP BY name2'
    
    EXEC(@sql)
    
  4. from https://stackoverflow.com/questions/7182106/sql-server-pivot-perhaps by cc-by-sa and MIT license