[mssql] insert z rotate table

0

mam cos takiego
table1
nazwa data
T1 2008
T2 2008
T3 2008
T4 2008

table2
id data T1 T2 T3 T4

table 1 mi sie zmienia co jakiś czas, bo program zewnętrzny zapelnia dane, a ja chciałbym to archiwizować w table 2
data w table 1 dla wszystkich wierszy jest zawsze taka sama
help:)

0

masz dwie opcje
mozesz uzyc pivot'a jesli liczba wartosci kolumny Nazwa jest stala (inaczej musialbys budowac dynamiczne zapytanie)
lub mozesz zrobic kilka odpowiednich zlaczen (join), ale to tez jesli liczba wartosci kolumny Nazwa jest stala i nie za duza
mozna ocywiscie jeszcze kilka innych rozwiazan wymyslic, posilkujac sie jakimis tymczasowymi tabelami, czy nawet kursorami (fuj)

declare @t1 table(nazwa nvarchar(50), data datetime)
insert into @t1 values ('T1', '2010-7-22')
insert into @t1 values ('T2', '2010-7-22')
insert into @t1 values ('T3', '2010-7-22')
insert into @t1 values ('T4', '2010-7-22')
insert into @t1 values ('T1', '2010-7-23')
insert into @t1 values ('T2', '2010-7-23')
insert into @t1 values ('T4', '2010-7-23')
insert into @t1 values ('T1', '2010-7-24')
insert into @t1 values ('T2', '2010-7-24')
insert into @t1 values ('T3', '2010-7-24')

select * from @t1

-- PIVOT
select data, [T1], [T2], [T3], [T4]
from @t1
pivot
(
count(nazwa)
for nazwa in ([T1], [T2], [T3], [T4])
) as T

-- JOIN
select T1.data, T1.nazwa as T1, T2.nazwa as T2, T3.nazwa as T3, T4.nazwa as T4
from (select * from @t1 where nazwa = 'T1') as T1
left join (select * from @t1 where nazwa = 'T2') as T2 on T1.data = T2.data
left join (select * from @t1 where nazwa = 'T3') as T3 on T1.data = T3.data
left join (select * from @t1 where nazwa = 'T4') as T4 on T1.data = T4.data

0

dzieki
wierszy mam stałą ilość, choć dużą, bo ok 100-200 i na szybko zrobilem to obracajac w C# datatable, choc fajnie byloby samego SQL uzyc
poprobuje:)

0
tomasz256 napisał(a)

wierszy mam stałą ilość, choć dużą, bo ok 100-200

rozumiem ze chodzi ci o to ze masz duzo tych wartosci, ktore maja stac sie kolumnami

w tedy pivot lub join'y to kupa rzezby
proponuje zmienna tabelaryczna utworzyc declare @T table (date datetime, T1, T2, T3, T4, ..., Tn)
a pozniej wybrac wszystkie daty z peirwotnej tabeli
insert into @tab (data)
select distinct data from Tab

a teraz jakas petle i w petli wybierasz dla wszystkich dat z @T wartosci T1 z tabeli pierwotnej i robisz update @T
w kolejnym przebiegu petli T2

troche mniej wydajne, ale jesli bedzie sie to zadko robic i przy ilosci 200 rekordow to nie ma znaczenia i tak co najwyzej 2s :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1