복붙노트

[SQL] 열과 행을 변환하는 방법

SQL

열과 행을 변환하는 방법

는 SQL Server 2005 데이터베이스를 조회 할 때 나는 간단한 문제가 있습니다. 나는 고객과 제품 (1> M)라는 테이블을 가지고있다. 한 고객은 대부분이 개 제품을 가지고있다. 대신 출력으로

CUSTOMERNAME, 제품 이름 ...

I는 출력에 좋아

CUSTOMERNAME, Product1Name, Product2Name ...

누군가의 도움이 날 수 있을까?

감사!

해결법

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

    1.다른 사람이 말한 것처럼, 당신은 PIVOT 및 UNPIVOT 연산자를 사용할 수 있습니다. 불행하게도, 모두 PIVOT 및 UNPIVOT의 문제점 중 하나는 당신이 사전에 또는 다른 사용하는 동적 SQL에서의 선회 될 값을 알 필요가 있습니다.

    다른 사람이 말한 것처럼, 당신은 PIVOT 및 UNPIVOT 연산자를 사용할 수 있습니다. 불행하게도, 모두 PIVOT 및 UNPIVOT의 문제점 중 하나는 당신이 사전에 또는 다른 사용하는 동적 SQL에서의 선회 될 값을 알 필요가 있습니다.

    귀하의 경우, 동적 SQL을 사용하는 필요 해요, 같은데. 이 작업을 얻으려면 잘은 제품 목록 조회에서 사용되는 끌어해야합니다. 당신이 AdventureWorks 데이터베이스를 사용한다면, 당신의 코드는 다음과 같을 것이다 :

    USE AdventureWorks;
    GO
    
    DECLARE @columns NVARCHAR(MAX);
    
    SELECT x.ProductName
    INTO #products
    FROM (SELECT p.[Name] AS ProductName
        FROM Purchasing.Vendor AS v
        INNER JOIN Purchasing.PurchaseOrderHeader AS poh ON v.VendorID = poh.VendorID
        INNER JOIN Purchasing.PurchaseOrderDetail AS pod ON poh.PurchaseOrderID = pod.PurchaseOrderID
        INNER JOIN Production.Product AS p ON pod.ProductID = p.ProductID
        GROUP BY p.[Name]) AS x;
    
    SELECT @columns = STUFF(
        (SELECT ', ' + QUOTENAME(ProductName, '[') AS [text()]
           FROM #products FOR XML PATH ('')
        ), 1, 1, '');
    
    SELECT @columns;
    

    이제 당신은 당신의 열을 가지고, 당신은 당신이 동적 쿼리와에 피벗 필요는 모든 것을 해낼 수 :

    DECLARE @sql NVARCHAR(MAX);
    
    SET @sql = 'SELECT CustomerName, ' + @columns + '
    FROM (
        // your query goes here
    ) AS source
    PIVOT (SUM(order_count) FOR product_name IN (' + @columns + ') AS p';
    
    EXEC sp_executesql @sql
    

    당신은 당신이 괜찮은 값을 얻을 수 있도록해야하는 경우 물론, 당신은 당신이 빌드 @columns에 사용하는 논리를 복제 유착에 코드를 잡아 것 @coalesceColumns 변수 (컬럼 이름, 0)를 생성 할 수 있습니다 경우 당신이 필요 쿼리에서 그런 종류의 물건.

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

    2.피벗 약 2 개 링크 여기 :

    피벗 약 2 개 링크 여기 :

    http://www.tsqltutorials.com/pivot.php

    http://www.simple-talk.com/sql/t-sql-programming/creating-cross-tab-queries-and-pivot-tables-in-sql/

    나는 피벗 내 문제를 해결하기)

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

    3.SQL2005에서 "PIVOT"열과 행 사이에서 변환하는데 사용될 수있다 "UNPIVOT"이라는 기능이있다.

    SQL2005에서 "PIVOT"열과 행 사이에서 변환하는데 사용될 수있다 "UNPIVOT"이라는 기능이있다.

    그것이 당신을 도울 수 있기를 바랍니다.

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

    4.다른 언급했듯이, SQL 2005은 아마 일반적인 사용을 위해 가장 적합한 PIVOT 기능을 가지고 있습니다. 그러나 경우에, 당신은 단순히 같은 것을 할 수 있습니다.

    다른 언급했듯이, SQL 2005은 아마 일반적인 사용을 위해 가장 적합한 PIVOT 기능을 가지고 있습니다. 그러나 경우에, 당신은 단순히 같은 것을 할 수 있습니다.

    Select 
     Customer,
     Sum(Case When Product = 'Foo' Then 1 Else 0 End) Foo_Count,
     Sum(Case When Product = 'Bar' Then 1 Else 0 End) Bar_Count
    From Customers_Products
    Group By Customer
    
  5. from https://stackoverflow.com/questions/347624/how-to-transform-rows-to-columns by cc-by-sa and MIT license