-- PIVOT 집계 대상 컬럼이 동일한 기준에 대해서 2개 이상인 경우 하는 방법이다...
-- 기준이 없는 경우 ROW_NUMBER() 등으로 동일 집계 기준을 임의 생성한다.
-- 임의 생성 기준에 대해 GemID 와 GemEnchantLevel 의 두개 집계컬럼을 PIVOT 하는 방법이다.
USE tempdb
GO
if object_id('AA1') is not null drop table AA1
if object_id('AA2') is not null drop table AA2
CREATE TABLE dbo.AA1(
WorldItemID bigint NOT NULL,
ItemID int NOT NULL,
ItemCount tinyint NOT NULL,
)
CREATE TABLE dbo.AA2(
WorldItemID bigint NOT NULL, -- 아이템시리얼 FK
GemWorldItemID bigint NOT NULL, -- Gem 시리얼 PK
GemID int NOT NULL, -- Gem ID
GemEnchantLevel tinyint NOT NULL, -- Gem 강화레벨
mDate datetime NOT NULL -- 날짜 소켓박힌 순서정렬에 사용한다
)
GO
/*
insert into AA1 values (1,1001,3)
insert into AA1 values (2,1005,1)
insert into AA1 values (3,2001,0)
insert into AA1 values (5,2002,1)
insert into AA2 values (2,81,101,1,getdate())
insert into AA2 values (2,82,105,3,getdate())
insert into AA2 values (2,83,107,4,getdate())
*/
select * from AA1
select * from AA2
-- AA1 중에서 AA2 에 소켓정보가 있는 행들의 정보를 열로 표현해야 한다.
-- 이 결과에서 GemID,GemEnchantLevel 두개를 PIVOT 해야한다.
-- 기준은 mDate 기준으로 생성해야 한다.
select
a.WorldItemID, a.ItemID
, ROW_NUMBER() OVER (PARTITION BY a.WorldItemID ORDER BY mDate ) as mNum
, b.GemID
, b.GemEnchantLevel
from AA1 a left outer join AA2 b on a.WorldItemID = b.WorldItemID
order by a.WorldItemID,b.mDate
SELECT
WorldItemID, ItemID, ItemCount
, MAX([1]) as Gem1
, MAX([2001]) as GemEnchantLevel1
, MAX([2]) as Gem2
, MAX([2002]) as GemEnchantLevel2
, MAX([3]) as Gem3
, MAX([2003]) as GemEnchantLevel3
FROM (
select
a.WorldItemID, a.ItemID, a.ItemCount
, ROW_NUMBER() OVER (PARTITION BY a.WorldItemID ORDER BY mDate ) as mNum
, ROW_NUMBER() OVER (PARTITION BY a.WorldItemID ORDER BY mDate ) + 2000 as mNum2
, b.GemID
, b.GemEnchantLevel
from AA1 a left outer join AA2 b on a.WorldItemID = b.WorldItemID
) SourceType
PIVOT
(
MAX(GemID )
FOR mNum IN ([1],[2],[3])
) AS PivotTable
PIVOT
(
MAX(GemEnchantLevel )
FOR mNum2 IN ([2001],[2002],[2003])
) AS PivotTable2
GROUP BY WorldItemID, ItemID, ItemCount
by 유효열 http://blog.naver.com/soundkey/220034980064