이 내용은 SQL Server 2008 R2에서 테스트되었습니다. 나는 여기 모든 것이 2005 년에도 잘 될 것이라고 믿습니다. 2005 년, 내가 기억하는 한, PIVOT을 처음부터 끝까지 도입했습니다. 어떤 문제가 있으면 알려주세요.
DECLARE @Products TABLE
(
ID INT IDENTITY(1, 1)
, Name VARCHAR(30)
);
INSERT INTO @Products
VALUES ('Dummies Guide to Querying'), ('SQL Design Patterns');
DECLARE @OldProducts TABLE
(
ID INT IDENTITY(1, 1)
, ProductID INT
, Location CHAR(2)
, HistoryDate DATE
, Sales INT
);
INSERT INTO @OldProducts
VALUES (1, 'CO', '20100601', 100)
, (1, 'CO', '20100701', 200)
, (1, 'CA', '20100526', 150)
, (2, 'CA', '20100601', 175);
DECLARE @NewProducts TABLE
(
ID INT IDENTITY(1, 1)
, ProductID INT
, Location CHAR(2)
, FutureDate DATE
, PredictedSales INT
);
INSERT INTO @NewProducts
VALUES (1, 'CO', '20110401', 200)
, (1, 'CO', '20110601', 250)
, (1, 'CA', '20110401', 150)
, (2, 'CA', '20110301', 180)
, (3, 'WA', '20110301', 100);
WITH AllProduts AS
(
SELECT
Products.Name
, OldProducts.Location
, DATENAME(MONTH, OldProducts.HistoryDate) AS MonthValue
, OldProducts.Sales
FROM @OldProducts AS OldProducts
INNER JOIN @Products AS Products
ON Products.ID = OldProducts.ProductID
UNION ALL
SELECT
Products.Name
, NewProducts.Location
, DATENAME(MONTH, NewProducts.FutureDate) AS MonthValue
, NewProducts.PredictedSales AS Sales
FROM @NewProducts AS NewProducts
INNER JOIN @Products AS Products
ON Products.ID = NewProducts.ProductID
)
SELECT
Name
, Location
, [January]
, [Febuary]
, [March]
, [April]
, [May]
, [June]
, [July]
, [August]
, [September]
, [October]
, [November]
, [December]
FROM AllProduts
PIVOT
(
SUM(Sales)
FOR MonthValue
IN
(
[January]
, [Febuary]
, [March]
, [April]
, [May]
, [June]
, [July]
, [August]
, [September]
, [October]
, [November]
, [December]
)
) PivotedTable
ORDER BY Name, Location;
당신은 동적 SQL이 필요하거나 모든 12 개월 하드 코딩 및 널 (null)이 있거나 MONTH1, MONTH2, Month3, Month4가 어쩌면 다시이 열이 무엇을 나타내는 지 someother 방법을 전달할 것이다. –
@Daniel, 피벗은 그가 원하는 것입니다. –
질문이 너무 모호합니다. A/B의 날짜가 월 이름의 문자열로 표시되며 한 달에 한 번만 기록됩니까? A와 B에 걸쳐 12 개 이상의 레코드가 존재하지 않을 것인가? 그것은 분명하지 않지만 다른 Product + Location 조합이 있다고 생각합니까? C의 한 행이 A와 B의 여러 행으로 구성되어 있고 A/B의 어느 행이 데이터를 가져 왔는지에 따라 C에서 "A & B의 다른 열"을 어떻게 표시 할 계획입니까? – RichardTheKiwi