복붙노트

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

SQL

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

나는 다음과 같이 보입니다 데이터 세트와 함께 일하고 있습니다.

이름과 과제의 수는 I는 다음과 유사한 결과를 얻을 필요가 동적입니다.

이제 이상적 I 포함 / 각각의 할당과 연관 될 수있는 "기한"을 기준으로 열을 정렬하고 싶습니다. 수 (그것은 계산하고 쿼리 가능하면 제거 할 수있다.) 경우 총 끝에되어야

나는 단순히 열을 명명, 내가 아직위한 좋은 해결책을 찾을 수없는 것을 동적 방식으로 그것을 할 노력과 피벗을 사용하여 3 개 과제를 위해 작업을 수행하는 방법을 알고있다. 나는 SQL 서버 2005이 작업을 수행하려합니다

편집하다

그 정책에 대해 같이 이상적으로는, 동적 SQL을 사용하지 않고이를 구현하고 싶습니다. 그것이 불가능하다면 ... 다음 동적 SQL로 동작하는 예제가 작동합니다.

해결법

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

    1.난 당신이 더 동적 SQL을 말했다 알지만, 바로 SQL에서 그것을 할 수있는 방법이 표시되지 않습니다.

    난 당신이 더 동적 SQL을 말했다 알지만, 바로 SQL에서 그것을 할 수있는 방법이 표시되지 않습니다.

    당신은 SQL 2005에서 피벗 테이블과 연결하여 열 및 PIVOT에서 유사한 문제에 대한 내 대답을 확인해보세요

    동적 SQL 주입에 취약가없는, 그것을 금지 할 이유가 없다. 또 다른 가능성 (데이터가 매우 자주 변화하는 경우) 코드를 생성 할 것이다 - 대신 동적 SQL 중, SQL 정기적 저장 프로 시저를 생성한다.

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

    2.PIVOT 귀하는 2005 + SQL Server에서 다음 코드를 사용할 수있는 SQL 동적를 사용하여이 데이터 :

    PIVOT 귀하는 2005 + SQL Server에서 다음 코드를 사용할 수있는 SQL 동적를 사용하여이 데이터 :

    테이블 만들기 :

    CREATE TABLE yourtable
        ([StudentName] varchar(8), [AssignmentName] varchar(12), [Grade] int)
    ;
    
    INSERT INTO yourtable
        ([StudentName], [AssignmentName], [Grade])
    VALUES
        ('StudentA', 'Assignment 1', 100),
        ('StudentA', 'Assignment 2', 80),
        ('StudentA', 'Total', 180),
        ('StudentB', 'Assignment 1', 100),
        ('StudentB', 'Assignment 2', 80),
        ('StudentB', 'Assignment 3', 100),
        ('StudentB', 'Total', 280)
    ;
    

    동적 PIVOT :

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(AssignmentName) 
                        from yourtable
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT StudentName, ' + @cols + ' from 
                 (
                    select StudentName, AssignmentName, grade
                    from yourtable
                ) x
                pivot 
                (
                    min(grade)
                    for assignmentname in (' + @cols + ')
                ) p '
    
    execute(@query)
    

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

    결과는 다음과 같습니다

    | STUDENTNAME | ASSIGNMENT 1 | ASSIGNMENT 2 | ASSIGNMENT 3 | TOTAL |
    --------------------------------------------------------------------
    |    StudentA |          100 |           80 |       (null) |   180 |
    |    StudentB |          100 |           80 |          100 |   280 |
    
  3. ==============================

    3.내가이 일을 찾은 유일한 방법은 동적 SQL을 사용하고 변수에 열 레이블을 배치하는 것입니다.

    내가이 일을 찾은 유일한 방법은 동적 SQL을 사용하고 변수에 열 레이블을 배치하는 것입니다.

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

    4.그런 다음, 열 이름 및 유형을 얻을 당신이 당신의 결과 집합을 빌드 할 때 서브 쿼리 결과를 사용하는 INFORMATION_SCHEMA를 조회 할 수 있습니다. 당신은 가능성이 로그인의 접근을 약간 수정해야합니다.

    그런 다음, 열 이름 및 유형을 얻을 당신이 당신의 결과 집합을 빌드 할 때 서브 쿼리 결과를 사용하는 INFORMATION_SCHEMA를 조회 할 수 있습니다. 당신은 가능성이 로그인의 접근을 약간 수정해야합니다.

  5. ==============================

    5.이것은 SQL 2005에서 PIVOT과 동일

    이것은 SQL 2005에서 PIVOT과 동일

    이 데이터는 보고서에서 소비하는 경우 당신은 SSRS 행렬을 사용할 수 있습니다. 이 결과 집합에서 동적으로 열을 생성합니다. 나는 그것을 여러 번 사용했습니다 - 그것은 동적 교차 분석 보고서 꽤 잘 작동합니다.

    여기에 좋은 예 w / 동적 SQL이다. http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx

  6. ==============================

    6.

    SELECT TrnType
    INTO #Temp1
    FROM
    (
        SELECT '[' + CAST(TransactionType AS VARCHAR(4)) + ']' AS TrnType FROM tblPaymentTransactionTypes
    ) AS tbl1
    
    SELECT * FROM #Temp1
    
    SELECT * FROM
    (
        SELECT FirstName + ' ' + LastName AS Patient, TransactionType, ISNULL(PostedAmount, 0) AS PostedAmount
        FROM tblPaymentTransactions
                INNER JOIN emr_PatientDetails ON tblPaymentTransactions.PracticeID = emr_PatientDetails.PracticeId
                INNER JOIN tblPaymentTransactionDetails ON emr_PatientDetails.PatientId = tblPaymentTransactionDetails.PatientID
                            AND tblPaymentTransactions.TransactionID = tblPaymentTransactionDetails.TransactionID
        WHERE emr_PatientDetails.PracticeID = 152
    ) tbl
    PIVOT (SUM(PostedAmount) FOR [TransactionType] IN (SELECT * FROM #Temp1)
    ) AS tbl4
    
  7. ==============================

    7.

    select studentname,[Assign1],[Assign2],[Assign3],[Total] 
    from 
    (
     select studentname, assignname, grade from student
    )s
    pivot(sum(Grade) for assignname IN([Assign1],[Assign2],[Assign3],[Total])) as pvt
    
  8. from https://stackoverflow.com/questions/213702/sql-server-2005-pivot-on-unknown-number-of-columns by cc-by-sa and MIT license