Twoje dane są już przestawiane, ale muszą zostać przestawione na innym poziomie. Myślę, że najlepszym sposobem na poradzenie sobie z tym jest najpierw unpivot, a następnie obsługa właściwego poziomu osi.
Krok 1:Unpivot
Możesz użyć SQL 2005 UNPIVOT polecenia CROSS JOIN lub użyj techniki CROSS JOIN. Oto przykłady obu. Zauważ, że pominąłem miesiące w środku, aby wszystko było proste. Po prostu dodaj je.
-- CROSS JOIN method (also works in SQL 2000)
SELECT
P.Project,
Mo =
DateAdd(mm,
X.MonthNum,
DateAdd(yy, P.[Year] - 1900, '19000101')
),
Amount =
CASE X.MonthNum
WHEN 0 THEN Jan
WHEN 1 THEN Feb
WHEN 11 THEN Dec
END
FROM
ProjectData P
CROSS JOIN (
SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 11
) X (MonthNum)
Każdy wiersz jest powtarzany 12 razy, a następnie instrukcja CASE wyciąga tylko jeden miesiąc dla każdego wiersza, pozostawiając dane niezmienione.
-- UNPIVOT method
SELECT
P.Project,
Mo =
DateAdd(mm,
Convert(int, P.MonthNum),
DateAdd(yy, P.[Year] - 1900, '19000101')
),
P.Amount
FROM
(
SELECT Project, [Year], [0] = Jan, [1] = Feb, [11] = Dec
FROM ProjectData
) X UNPIVOT (Amount FOR MonthNum IN ([0], [1], [11])) P
DROP TABLE ProjectData
Żadna z metod nie jest przez cały czas wyraźnym zwycięzcą wydajności. Czasami jeden działa lepiej niż drugi (w zależności od danych podlegających przestawieniu). Metoda UNPIVOT używa filtra w planie wykonania, którego nie używa CROSS JOIN.
Krok 2:Przestaw ponownie
Teraz, jak korzystać z danych nieprzestawnych. Nie powiedziałeś, jak ktoś będzie to zużywać, ale ponieważ będziesz musiał umieścić dane w jakimś pliku wyjściowym, proponuję skorzystać z usług SSRS (Sql Server Reporting Services), które są dostarczane z SQL Server 2005 bez dodatkowych opłat.
Wystarczy użyć macierzy Zgłoś obiekt, aby przestawić jedno z powyższych zapytań. Ten obiekt szczęśliwie określa wartości danych, które mają zostać przekształcone w etykiety kolumn w czasie wykonywania raportu i brzmi dokładnie tak, jak potrzebujesz. Jeśli dodasz kolumnę, która formatuje datę dokładnie tak, jak chcesz, możesz uporządkować według kolumny Mo, ale użyj nowego wyrażenia jako etykiety kolumny.
SSRS oferuje również szeroką gamę dostępnych formatów i opcji planowania. Na przykład możesz wysłać e-mailem plik Excela lub zapisać stronę internetową w udziale plików.
Daj mi znać, jeśli coś pominąłem.
Dla każdego, kto chciałby zobaczyć powyższy kod w akcji, oto kilka skryptów dla Ciebie:
USE tempdb
CREATE TABLE ProjectData (
Project varchar(10),
[Year] int,
Jan decimal(15, 2),
Feb decimal(15, 2),
Dec decimal(15, 2)
)
SET NOCOUNT ON
INSERT ProjectData VALUES ('11-11079', 2008, 0.0, 0.0, 75244.90)
INSERT ProjectData VALUES ('11-11079', 2009, 466.0, 0.0, 0.0)
INSERT ProjectData VALUES ('11-11079', 2010, 855.0, 0.0, 0.0)
INSERT ProjectData VALUES ('01-11052', 2009, 56131.0, 0.0, 0.0)