Vaše data jsou již převedena, ale je třeba je přesunout na jinou úroveň. Myslím, že nejlepším způsobem, jak to zvládnout, je nejprve to uvolnit a poté zpracovat správnou úroveň otáčení.
Krok 1:Odklopení
Můžete použít SQL 2005 UNPIVOT nebo použijte techniku CROSS JOIN. Zde jsou příklady obojího. Všimněte si, že jsem uprostřed vynechal měsíce, aby byly věci jednoduché. Stačí je přidat.
-- 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ždý řádek se opakuje 12krát, pak příkaz CASE vytáhne pro každý řádek pouze jeden měsíc, takže data zůstanou pěkně neotočná.
-- 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
Ani jedna metoda není vždy jasným vítězem výkonu. Někdy jeden funguje lépe než druhý (v závislosti na pivotovaných datech). Metoda UNPIVOT používá v plánu provádění filtr, který CROSS JOIN nepoužívá.
Krok 2:Znovu otočte
Nyní, jak používat unpivoted data. Neřekli jste, jak váš někdo bude to spotřebovávat, ale protože budete muset vložit data do nějakého výstupního souboru, navrhuji použít SSRS (Sql Server Reporting Services), který je dodáván s SQL Server 2005 bez dalších poplatků.
Stačí použít Matrix objekt reportu pro pivotování jednoho z výše uvedených dotazů. Tento objekt šťastně určuje datové hodnoty, které se mají převést do popisků sloupců za běhu sestavy, a zní jako přesně to, co potřebujete. Pokud přidáte sloupec, který formátuje datum přesně tak, jak chcete, můžete seřadit podle sloupce Mo, ale jako popisek sloupce použijte nový výraz.
SSRS má také k dispozici širokou škálu formátů a možností plánování. Můžete jej například nechat poslat e-mailem soubor aplikace Excel nebo uložit webovou stránku do sdíleného souboru.
Pokud jsem něco vynechal, dejte mi prosím vědět.
Pro každého, kdo by chtěl vidět výše uvedený kód v akci, je zde pro vás nějaký skript pro vytvoření:
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)