programing

TSQL 피벗(애그리게이트 기능 없음)

lastcode 2023. 4. 7. 21:28
반응형

TSQL 피벗(애그리게이트 기능 없음)

이런 테이블이 있는데...

고객.아이디 DBColumn 이름 데이터.
1 이름 조.
1 미들네임 S
1 스미스
1 날짜. 12/12/2009
2 이름 샘.
2 미들네임 S
2 프레드릭
2 날짜. 1/12/2009
3 이름 제이미
3 미들네임 S
3 캐롤이야.
3 날짜. 12/1/2009

그리고 난 이걸 원해...

피벗을 사용하여 이것이 가능합니까?

고객.아이디 이름 미들네임 날짜.
1 조. S 스미스 12/12/2009
2 샘. S 프레드릭 1/12/2009
3 제이미 S 캐롤이야. 12/1/2009

그래, 하지만 왜!!--

   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

MAX Aggregate를 사용할 수 있지만 계속 작동합니다.1개의 값의 MAX = 해당 값..

이 경우 테이블 참조별로 dbColumnName을 기준으로 필터링하여 customerid에 5번 직접 가입할 수도 있습니다.그게 더 잘 풀릴지도 몰라.

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;

질문이 서툴러서 미안해 Gbn이 날 제대로 이끌었어이게 제가 찾고 있던 답변입니다.

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

그 후 while 문을 사용하여 위의 문을 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)

while loop을 사용하여 @fulltext를 작성하고 테이블에서 고유한 컬럼 이름을 선택합니다.답변 감사합니다.

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을 실행하지 않았습니다.무슨 말인지 아시겠죠?

OP는 실제로는 agregation 없이 피벗할 필요가 없었습니다.다만, 여기 오신 분은, 다음의 내용을 확인해 주세요.

sql 매개 변수화된 cte 쿼리

이 질문에 대한 답변은 집약을 하지 않고 피벗을 해야 하는 상황을 포함하므로, 이를 수행하는 예가 솔루션의 일부입니다.

이 조작은 유효합니다.

select * from (select [CustomerID]  ,[Demographic] ,[Data]
from [dbo].[pivot]
) as Ter

pivot (max(Data) for  Demographic in (FirstName, MiddleName, LastName, [Date]))as bro

이것을 시험해 보세요.

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

다음은 피벗 쿼리의 동적 필드를 작성하는 좋은 방법입니다.

--tmp 테이블에 값을 추가합니다.

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')

언급URL : https://stackoverflow.com/questions/1343145/tsql-pivot-without-aggregate-function

반응형