SUPERSLIMAK




Transponowane tabele z użyciem kursorów w SQL Server T-SQL(12.06.2008)

1. Wstęp
2. Przygotowanie kursora


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:
przekladowe dane do transponowania
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.
transponowana tabela
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.
kompletne rozwiązanie

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ł

Komentarze

Brak komentarzy
*Imię:
Email:
Informuj mnie o nowych komentarzach na tej stronie
Ukryj email
*Treść:
 
Powered by Scriptsmill Comments Script