1. Wstęp
|
1.Wstęp
Transponowane tabele to całkiem popularne rozwiązanie podczas
tworzenia wizualizacji danych na przykłada do
formy raportu.
Transponować czyli przenosić z jednej dziedziny do innej, przystosowywać
coś do czegoś (wg WN PWN S.A.).
Poniższy artykuł skoncentruje się na
najbardziej podstrawowym przykładzie gdzie będziemy mieć tabelę o takich
danych:
Aby dokonać transpozycji powyższych danych uzyję kursorów w T-SQL na
serwerze SQL Server 2005.
Kursorem nazywamy obiekt bazodanowy do
operowania na danych zwracanych z wiersza zdefiniowanego zapytania.
Wyniki kursora zostaną zapisane w tabeli.
2.Przygotowanie kursora
W pierwszym etapie musimy stworzyć nową tabelę, której kolumny
zostaną stworzone z rekordów z kolumny NazwaParametr.
--usun tabele jezeli istnieje DECLARE @IFEXISTS int SELECT @IFEXISTS = (SELECT count(1) FROM sysobjects WHERE xtype = 'U' AND name = 'TransponowanyParametr') IF @IFEXISTS = 1 BEGIN DROP TABLE [dbo].[TransponowanyParametr] END --stworz tabele SELECT 1 as ID INTO [dbo].[TransponowanyParametr] --uzupelnij strukture tabeli kolumnami DECLARE @ParNazwa nvarchar(100) DECLARE @AlterTableScript nvarchar(150) DECLARE cur_TransponowaneParametry CURSOR FOR SELECT [NazwaParametr] from [dbo].[Parametr] OPEN cur_TransponowaneParametry FETCH NEXT FROM cur_TransponowaneParametry INTO @ParNazwa WHILE @@FETCH_STATUS=0 BEGIN SET @AlterTableScript = 'ALTER TABLE [dbo].[TransponowanyParametr] ADD [' + REPLACE(REPLACE(@ParNazwa,'[',''),']','') +'] int' EXEC (@AlterTableScript) FETCH NEXT FROM cur_TransponowaneParametry INTO @ParNazwa END CLOSE cur_TransponowaneParametry DEALLOCATE cur_TransponowaneParametry
Na tym etapie po każdym uruchomieniu kursora tabela
TransponowanyParametr zostanie usunięta i stworzona na nowo.
Ostatnim elementem jest wypełnienie nowej tabeli danymi.
DECLARE @ParWart nvarchar(100) DECLARE @UpdateTableScript nvarchar(150) DECLARE cur_NazwaParametr CURSOR FOR SELECT [NazwaParametr],[WartoscParametr] FROM [dbo].[Parametr] OPEN cur_NazwaParametr FETCH NEXT FROM cur_NazwaParametr INTO @ParNazwa,@ParWart WHILE @@FETCH_STATUS=0 BEGIN SET @UpdateTableScript='UPDATE [dbo].[TransponowanyParametr]' SET @UpdateTableScript= @UpdateTableScript + ' SET ['+REPLACE(REPLACE(@ParNazwa,'[',''),']','')+'] ='''+@ParWart+'''' EXEC (@UpdateTableScript) FETCH NEXT FROM cur_NazwaParametr INTO @ParNazwa,@ParWart END CLOSE cur_NazwaParametr DEALLOCATE cur_NazwaParametr
W wyniku działania powyższych rozwiązań powstaje transponowana tabela z
danymi.
Oczywiście - to rozwiązanie jest bardzo bardzo podstawowe, i dla
wszelkich rozwiązań musi być rozbudowane o
dodatkową logikę. Celem było
przedstawienie koncepcji, która może być bazą dla dlaszej pracy.
Pozdrawiam
Michał