복붙노트

[SQL] 집계 함수없이 SQL 서버에서 피벗 쿼리를 만드는 방법

SQL

집계 함수없이 SQL 서버에서 피벗 쿼리를 만드는 방법

나는 MS SQL Server 2008을 사용하고 난 데이터를 다음 있습니다 :

select * from account;

| PERIOD | ACCOUNT | VALUE |
----------------------------
|   2000 |   Asset |   205 |
|   2000 |  Equity |   365 |
|   2000 |  Profit |   524 |
|   2001 |   Asset |   142 |
|   2001 |  Equity |   214 |
|   2001 |  Profit |   421 |
|   2002 |   Asset |   421 |
|   2002 |  Equity |   163 |
|   2002 |  Profit |   325 |

나는 그들이이 될 수 있도록합니다 :

| ACCOUNT | 2000 | 2001 | 2002 |
--------------------------------
|   Asset |  205 |  142 |  421 |
|  Equity |  365 |  214 |  163 |
|  Profit |  524 |  421 |  325 |

나는 쿼리를 사용 피벗 쿼리에 시도했지만 값이 집계 함수를 사용해야하고 결과는 적합하지 않습니다. 어떻게해야합니까?

해결법

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

    1.

    SELECT *
    FROM
    (
    SELECT [Period], [Account], [Value]
    FROM TableName
    ) AS source
    PIVOT
    (
        MAX([Value])
        FOR [Period] IN ([2000], [2001], [2002])
    ) as pvt
    

    또 다른 방법,

    SELECT ACCOUNT,
          MAX(CASE WHEN Period = '2000' THEN Value ELSE NULL END) [2000],
          MAX(CASE WHEN Period = '2001' THEN Value ELSE NULL END) [2001],
          MAX(CASE WHEN Period = '2002' THEN Value ELSE NULL END) [2002]
    FROM tableName
    GROUP BY Account
    
  2. ==============================

    2.뿐만 아니라이 체크 아웃 : XML 경로 및 피벗을 사용하여

    뿐만 아니라이 체크 아웃 : XML 경로 및 피벗을 사용하여

    SQL 휘티 d 혀라도

    | ACCOUNT | 2000 | 2001 | 2002 |
    --------------------------------
    |   Asset |  205 |  142 |  421 |
    |  Equity |  365 |  214 |  163 |
    |  Profit |  524 |  421 |  325 |
    
    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.period) 
                FROM demo c
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT account, ' + @cols + ' from 
                (
                    select account
                        , value
                        , period
                    from demo
               ) x
                pivot 
                (
                     max(value)
                    for period in (' + @cols + ')
                ) p '
    
    
    execute(@query)
    
  3. from https://stackoverflow.com/questions/14618316/how-to-create-a-pivot-query-in-sql-server-without-aggregate-function by cc-by-sa and MIT license