반응형
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 없이 피벗할 필요가 없었습니다.다만, 여기 오신 분은, 다음의 내용을 확인해 주세요.
이 질문에 대한 답변은 집약을 하지 않고 피벗을 해야 하는 상황을 포함하므로, 이를 수행하는 예가 솔루션의 일부입니다.
이 조작은 유효합니다.
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
반응형
'programing' 카테고리의 다른 글
매개 변수 선언에서 varchar(MAX)의 크기는 어떻게 됩니까? (0) | 2023.04.07 |
---|---|
SQL Server의 for-loop 구문 (0) | 2023.04.07 |
개별 항목에 액세스할 수 있도록 구분된 문자열을 분할하려면 어떻게 해야 합니까? (0) | 2023.04.07 |
WHERE 절(SQL Server 사용 중)에서 대소문자를 구분하는 검색 방법은 무엇입니까? (0) | 2023.04.07 |
기존 테이블에서 열을 제거하려면 어떻게 해야 합니까? (0) | 2023.04.07 |