Điều này đã được thử nghiệm trong SQL Server 2008 R2. Tôi tin rằng mọi thứ ở đây sẽ hoạt động tốt trong năm 2005. Năm 2005, theo như tôi nhớ, đã giới thiệu PIVOT và OVER cùng những thứ khác. Nếu bạn thấy bất kỳ vấn đề nào, hãy cho tôi biết.
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;