복붙노트

[SQL] 집계 함수없이 TSQL 피벗

SQL

집계 함수없이 TSQL 피벗

나는이 같은 테이블이 ...

CustomerID   DBColumnName   Data
--------------------------------------
1            FirstName      Joe
1            MiddleName     S
1            LastName       Smith
1            Date           12/12/2009
2            FirstName      Sam
2            MiddleName     S
2            LastName       Freddrick
2            Date           1/12/2009
3            FirstName      Jaime
3            MiddleName     S
3            LastName       Carol
3            Date           12/1/2009

그리고이 원하는 ...

이 가능하여 PIVOT인가?

CustomerID  FirstName   MiddleName          LastName        Date
----------------------------------------------------------------------
1           Joe             S               Smith           12/12/2009
2           Sam             S               Freddrick       1/12/2009
3           Jaime           S               Carol           12/1/2009

해결법

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

    1.당신은 MAX 집계를 사용할 수 있습니다, 그것은 여전히 ​​작동합니다. 하나 개의 값의 MAX 값은 = ..

    당신은 MAX 집계를 사용할 수 있습니다, 그것은 여전히 ​​작동합니다. 하나 개의 값의 MAX 값은 = ..

    이 경우, 당신은 또한 자기 테이블 참조 당 dbColumnName에 의해 CustomerID를 5 번, 필터에 가입 할 수있다. 그것은 더 나은 해결 수 있습니다.

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

    2.네, 그런데 왜!?

    네, 그런데 왜!?

       Select CustomerID,
         Min(Case DBColumnName When 'FirstName' Then Data End) FirstName,
         Min(Case DBColumnName When 'MiddleName' Then Data End) MiddleName,
         Min(Case DBColumnName When 'LastName' Then Data End) LastName,
         Min(Case DBColumnName When 'Date' Then Data End) Date
       From table
       Group By CustomerId
    
  3. ==============================

    3.

    WITH pivot_data AS
    (
    SELECT customerid, -- Grouping Column
    dbcolumnname, -- Spreading Column
    data -- Aggregate Column
    FROM pivot2 
    )
    SELECT customerid, [firstname], [middlename], [lastname]
    FROM pivot_data
    PIVOT (max(data) FOR dbcolumnname IN ([firstname],[middlename],[lastname])) AS p;
    
  4. ==============================

    4.좋아, 가난한 질문에 대한 죄송합니다. GBN는 바른 길에 저를 얻었다.  이것은 내가 대답에서 무엇을 찾고 있었다입니다.

    좋아, 가난한 질문에 대한 죄송합니다. GBN는 바른 길에 저를 얻었다.  이것은 내가 대답에서 무엇을 찾고 있었다입니다.

    SELECT [FirstName], [MiddleName], [LastName], [Date] 
    FROM #temp 
    PIVOT
    (   MIN([Data]) 
        FOR [DBColumnName] IN ([FirstName], [MiddleName], [LastName], [Date]) 
    )AS p
    

    그럼 난 문 동안을 사용하고 VARCHAR 및 사용 dynmaic의 SQL로 위의 문을 작성했다.

    이 같은 것을 사용

    SET @fullsql = @fullsql + 'SELECT ' + REPLACE(REPLACE(@fulltext,'(',''),')','')
    SET @fullsql = @fullsql + 'FROM #temp '
    SET @fullsql = @fullsql + 'PIVOT'
    SET @fullsql = @fullsql + '('
    SET @fullsql = @fullsql + ' MIN([Data])'
    SET @fullsql = @fullsql + ' FOR [DBColumnName] IN '+@fulltext
    SET @fullsql = @fullsql + ')'
    SET @fullsql = @fullsql + 'AS p'
    
    EXEC (@fullsql)
    

    A는 동안 루프를 사용 @fulltext 구축하고 테이블에서 별개의 열 이름을 선택하는 데. 답변 주셔서 감사합니다.

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

    5.

    SELECT
    main.CustomerID,
    f.Data AS FirstName,
    m.Data AS MiddleName,
    l.Data AS LastName,
    d.Data AS Date
    FROM table main
    INNER JOIN table f on f.CustomerID = main.CustomerID
    INNER JOIN table m on m.CustomerID = main.CustomerID
    INNER JOIN table l on l.CustomerID = main.CustomerID
    INNER JOIN table d on d.CustomerID = main.CustomerID
    WHERE f.DBColumnName = 'FirstName' 
    AND m.DBColumnName = 'MiddleName' 
    AND l.DBColumnName = 'LastName' 
    AND d.DBColumnName = 'Date' 
    

    편집 : 나는 편집기없이이 작성한 및 SQL을 실행하지 않았습니다. 난 당신이 생각을, 희망한다.

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

    6.영업 이익은 실제로 볼 방법을 알고 집계하지 않고 있지만, 여기에오고 당신의 사람들을 위해 선회에 필요하지 않았다 :

    영업 이익은 실제로 볼 방법을 알고 집계하지 않고 있지만, 여기에오고 당신의 사람들을 위해 선회에 필요하지 않았다 :

    SQL 매개 변수화 CTE 쿼리

    그 질문에 대한 대답은 그 일을하는 예는 솔루션의 일부가 그래서 응집없이 선회가 필요한 상황을 포함한다.

  7. ==============================

    7.이 시도:

    이 시도:

    SELECT CUSTOMER_ID, MAX(FIRSTNAME) AS FIRSTNAME, MAX(LASTNAME) AS LASTNAME ...
    
    FROM
    (
    
    SELECT CUSTOMER_ID, 
           CASE WHEN DBCOLUMNNAME='FirstName' then DATA ELSE NULL END AS FIRSTNAME,
           CASE WHEN DBCOLUMNNAME='LastName' then DATA ELSE NULL END AS LASTNAME,
            ... and so on ...
    GROUP BY CUSTOMER_ID
    
    ) TEMP
    
    GROUP BY CUSTOMER_ID
    
  8. ==============================

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

    이 작업을해야합니다 :

    select * from (select [CustomerID]  ,[Demographic] ,[Data]
    from [dbo].[pivot]
    ) as Ter
    
    pivot (max(Data) for  Demographic in (FirstName, MiddleName, LastName, [Date]))as bro
    
  9. ==============================

    9.다음은 피벗 쿼리에 대한 동적 필드를 구축 할 수있는 좋은 방법입니다 :

    다음은 피벗 쿼리에 대한 동적 필드를 구축 할 수있는 좋은 방법입니다 :

    tmp를 테이블에 값을 --summarize

    declare @STR varchar(1000)
    SELECT  @STr =  COALESCE(@STr +', ', '') 
    + QUOTENAME(DateRange) 
    from (select distinct DateRange, ID from ##pivot)d order by ID
    

    --- 생성 된 필드를 참조

    print @STr
    
    exec('  .... pivot code ...
    pivot (avg(SalesAmt) for DateRange IN (' + @Str +')) AS P
    order by Decile')
    
  10. from https://stackoverflow.com/questions/1343145/tsql-pivot-without-aggregate-function by cc-by-sa and MIT license