Bartek Borczyk

Bartek Borczyk Operator liczb i
słów

Temat: KWESTIA PROJEKTU

Mam tabelę:

strMagazyn_Symbol|strMagazyn_Lokalizacja|itd...


Jedną z cech magazynu jest rks, który może się zmieniać w zależności od miesiąca. Chcę oprzeć projekt na relacji dynamicznej a nie na zapisywaniu danych statycznie.

Analizując sprzedaż w danym miesiącu muszę doparować rks do magazynu. Do tej pory robiłem to w ten sposób, że wprowadzałem sobie atrybut pomocniczy strMagazyn_Okres dopisując rks z tabeli pomocniczej. Minusem takiego rozwiązania jest konieczność powielania magazynów co miesiąc w dół. W takiej sytuacji parowałem tabelę po atrybucie pomocniczym.

Dziś natchnęło mnie, że zamiast powielania krotek w dół mogę zapisywać rks dla kolejnych miesięcy jako atrybuty (strRks_201001|strRks_201002|itd.) i rozszerzać tabelę w bok.

I teraz pojawia się kwestia zapytania.

Wcześniej było tak:

select
s.strMagazyn_Symbol,
m.strMagazyn_Lokalizacja,
s.dteUmowa_Data,
mo.strRks
from
tblGtiSprzedaż_Postpaid as s
inner join tblGtiSłowniki_Magazyny as m
on s.strMagazyn_Symbol = m.strMagazyn_Symbol
inner join tblGtiSłowniki_MagazynyOkres as mo
on (s.strMagazyn_Symbol + left(convert(varchar(6),s.dteUmowaData,112),6) = m.strMagazynOkres_Symbol


Po nowemu wymyśliłem, że mogłoby być tak:

select
s.strMagazyn_Symbol,
m.strMagazyn_Lokalizacja,
s.dteUmowa_Data,
case left(convert(varchar(8),s.dteUmowa_Data,112),6)
when '201001' then m.strRks_201001
when '201002' then m.strRks_201002
...
end as strRks
from
tblGtiSprzedaż_Postpaid as s
inner join tblGtiSłowniki_Magazyny as m on s.strMagazyn_Symbol = m.strMagazyn_Symbol


Do rzeczy. Nużące byłoby wpisywanie when'ów w bloku case w nieskończoność. Szukam sposobu na zwrócenie atrybutu w zależności od wartości w left(convert(varchar(8),s.dteUmowa_Data,112),6). Da się? Jakieś inne sugestie jak najlepiej to zrobić?Bartosz Borczyk edytował(a) ten post dnia 17.04.10 o godzinie 00:43
Paweł B.

Paweł B. architekt baz danych
/ SQL Developer /BI
Developer

Temat: KWESTIA PROJEKTU

dynamicznym sqlem

konto usunięte

Temat: KWESTIA PROJEKTU

drobny szczegół

select left(convert(varchar(6),getdate(),112),6)


można zastąpić

select convert(varchar(6),getdate(),112)


a ja z mojej strony dodam
jak masz dane w takiej postaci że kolumna, kolumna, kolumna .... to potraktuje je unpivotem i dopiero działaj

http://msdn.microsoft.com/en-us/library/ms177410.aspxPrzemysław R. edytował(a) ten post dnia 17.04.10 o godzinie 12:34
Robert Woźniak

Robert Woźniak Digital Advisor &
Founder

Temat: KWESTIA PROJEKTU

Również polecam unpivot :)
Bartek Borczyk

Bartek Borczyk Operator liczb i
słów

Temat: KWESTIA PROJEKTU

Jeszcze raz. Mając tabelę u_GtiSłowniki_Magazyny:


Magazyn_Symbol|Rks_201001|Rks_201002|itd.


...bym chciał zrobić

select Magazyn_Symbol + '_' + right(Rks_Okresy,6) as Magazyn_Okres, Magazyn_Symbol, Rks_DlaOkresu as Magazyn_Rks
from dbo.u_GtiSłowniki_Magazyny as t
unpivot(Rks_DlaOkresu for Rks_Okresy in((select (stuff((select ',' + name
from sys.all_columns
where object_id = object_id('dbo.u_GtiSłowniki_Magazyny','U') and name like 'Rks_%'
for xml path('')),1,1,''))))) as ut


Tak niestety wali błędem.

Działa jak robię dynamicznie:

declare @Sql varchar(max)
set @Sql = '
select Magazyn_Symbol + ''_'' + right(Rks_Okresy,6) as Magazyn_Okres, Magazyn_Symbol, Rks_DlaOkresu as Magazyn_Rks
from dbo.u_GtiSłowniki_Magazyny as t
unpivot(Rks_DlaOkresu for Rks_Okresy in(' + (select (stuff((select ',' + name
from sys.all_columns
where object_id = object_id('dbo.u_GtiSłowniki_Magazyny','U') and name like 'Rks_%'
for xml path('')),1,1,''))) + ')) as ut'
print @Sql
exec(@Sql)


Zmierzam do tego, że mieć dostęp do tabeli wynikowej powiedzmy z funkcji (tu nie można używać exec?), procedury (da się select (exec procedura)?), widoku i żeby to się dało dalej joinować:

select * from sprzedaż as s inner join (wynik) as w itd.Bartosz Borczyk edytował(a) ten post dnia 07.05.10 o godzinie 14:36

konto usunięte

Temat: KWESTIA PROJEKTU

Bartosz Borczyk:
Zmierzam do tego, że mieć dostęp do tabeli wynikowej powiedzmy
z funkcji (tu nie można używać exec?), procedury (da się select (exec procedura)?), widoku i żeby to się dało dalej joinować:

select * from sprzedaż as s inner join (wynik) as w itd.Bartosz Borczyk edytował(a) ten post dnia 07.05.10 o godzinie 14:36

jest exec into, tyle że trzeba koniecznie zadeklarować tabelę np. tymczasową z konkretnymi polami i dopiero wykonać

jak już ma tabelę tymczasową to robisz z tym co chcesz



Wyślij zaproszenie do