복붙노트

[SQL] SQL 서버는 테이블과 피벗 가입

SQL

SQL 서버는 테이블과 피벗 가입

나는 데이터를 두 개의 테이블이

1 번 테이블

    ---------------------------------------------------
    | SALEID | SOLDBY | SALEPRICE | MARGIN |   DATE   |
    |  1     |  'aa'  |  10,000   |   10   | 2013-1-1 |
    |  2     |  'bb'  |  25,000   |    5   | 2013-5-1 |

표 2

    ---------------------------------------------------
    | SALEITEMID | SALEID | SALEPRICE | CATEGORY |
    |  1         |  1     |   6,000   | BOOKS    |
    |  2         |  1     |   4,000   | PRINTING |
    |  3         |  2     |   5,000   | BOOKS    |
    |  4         |  2     |   12,000  | PRINTING |
    |  5         |  2     |   8,000   | DVD      |

생산되는 I는 질의를 필요로

따르다

    --------------------------------------------------------------------------------
    | SALEID | SOLDBY | SALEPRICE | MARGIN |   DATE   |  BOOKS  | PRINTING | DVD
    |  1     |  'aa'  |  10,000   |   10   | 2013-1-1 |  6,000  |  4,000   | 0
    |  2     |  'bb'  |  25,000   |    5   | 2013-5-1 |  5,000  | 12,000   | 8,000

나는 회전 꽤 새로운 오전과 피벗이 여부에 갈 수있는 방법이 확실하지합니다.

해결법

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

    1.이 작업을해야합니다 :

    이 작업을해야합니다 :

    WITH Sales AS (
       SELECT
          S.SaleID,
          S.SoldBy,
          S.SalePrice,
          S.Margin,
          S.Date,
          I.SalePrice,
          I.Category
       FROM
          dbo.Sale S
          INNER JOIN dbo.SaleItem I
             ON S.SaleID = I.SaleID
    )
    SELECT *
    FROM
       Sales
       PIVOT (Max(SalePrice) FOR Category IN (Books, Printing, DVD)) P
    ;
    

    또는 번갈아 :

    SELECT
       S.SaleID,
       S.SoldBy,
       S.SalePrice,
       S.Margin,
       S.Date,
       I.Books,
       I.Printing,
       I.DVD
    FROM
       dbo.Sale S
       INNER JOIN (
          SELECT *
          FROM
             (SELECT SaleID, SalePrice, Category FROM dbo.SaleItem) I
             PIVOT (Max(SalePrice) FOR Category IN (Books, Printing, DVD)) P
       ) I ON S.SaleID = I.SaleID
    ;
    

    이 같은 결과 집합이 실제로 쿼리 최적화에 의해 동일하게 취급 할 수있다, 그러나 가능하지. 당신은 - 당신이 테이블 테스트하고 잘 작동하는 쿼리 표시되어야 판매에 조건을 넣어 시작할 때 큰 차이가 놀이로 제공됩니다.

    난 당신이 프레 젠 테이션 계층에서 회전을 할, 그러나, 제안 할 수 있습니다? 예를 들어, 당신은 SSRS를 사용하는 경우 당신을 위해 모든 회전을 할 것 매트릭스 컨트롤을 사용하는 것은 매우 쉽습니다. 새 카테고리를 추가하는 경우 다음, 당신은 당신의 SQL 코드를 수정하지 않기 때문에 즉, 최고입니다!

    이 동적으로 피벗에 열 이름을 찾을 수있는 방법이지만, 동적 SQL을 포함한다. 것이 가능하지만 정말, 최선의 방법으로 그 추천, 하나하지 않습니다.

    일할 수있는 또 다른 방법은이 쿼리 의미있는 모든 현존하는 범주를 포함하는 뷰를 다시 작성 범주 테이블에 트리거를 설정을 사전 처리하는 것입니다. 이것은 내가 언급했던 다른 많은 문제를 해결하지, 그러나 다시, 프리젠 테이션 레이어를 사용하는 것이 가장 좋습니다.

    참고 : (이전 값이었다) 공백이 당신의 열 이름, 숫자 또는 숫자로 시작하거나, 유효한 식별자 달리하지 않은 경우, 당신은 [(PIVOT 카테고리 ID에있어 (최대 (값)에서와 같이 대괄호로 인용한다 1], [2], [3], [4 그들이 어떤 문자 또는 제거 공간을 앞에 추가 할 수있는 쿼리의 PIVOT 부분에 도착하기 전에])) P. 다른 방법으로, 당신은 값을 수정할 수 있도록 열 목록 아무튼 그 ' t 탈출해야합니다. SQL Server의 식별자에 대한 규칙 아웃이 검사에 대한 자세한 독서하십시오.

  2. from https://stackoverflow.com/questions/17073134/sql-server-join-tables-and-pivot by cc-by-sa and MIT license