Odwrócenie bazy wertykalnej do horyzontalnej

0

Cześć,

Mam do wyraportowania trochę danych z ciekawie zaprojektowanej bazy, wszystkie tabele w systemie są zapisywane w dwukolumnowej bazie z dwoma indeksami [i][j]. Raportować mogę pojedynczymi zapytaniami. Czy da radę z tabeli nr1, jednym zapytaniem zrobić tabelę nr 2 i jednym zapytaniem zrobić tabelę nr 3? Tzn. pierwszy raport - pokaż mi wartości dla grupy i=1, drugi raport, pokaż mi wartości dla grupy i=2.
To poniżej to oczywiście abstrakcyjny przykład. Oryginalne dane mają dziesiątki pozycji i oraz j, fajnie jakby dało w miarę uniwersalne zapytanie zbudować, żebym mógł dowolnie te dane wyciągać, dla dowolnej ilości parametrów.

**parametr	wartość**
CENA_1_1	120,00
CENA_1_2	50,00
CENA_1_3	20,00
CENA_2_1	100,00
CENA_2_2	20,00
IL_1_1	1000,000
IL_1_2	2,000
IL_1_3	1000,000
IL_2_1	500,000
IL_2_2	500,000
JM_1_1	m2
JM_1_2	szt.
JM_1_3	m2
JM_2_1	m2
JM_2_2	m2

Grupa i=1
**cena	ilość		jednostka	**	
120,00	1000,000	m2
50,00	2,000		szt.
20,00	1000,000	m2
Grupa i=2
**cena	ilość		jednostka	**
100,00	500,000		m2
20,00	500,000		m2
0

PIVOT

0

a czy w tym przypadku nie dostanę tyle kolumn ile mam wierszy?
chodzi o to, żeby pogrupował po części nazwy tzn.
pierwsza tabela
CENA_1_, IL_1_, JM_1_*
druga tablea
CENA_2_, IL_2_, JM_2_*

a pivot chyba da mi:
CENA_1_1, CENA_1_2, CENA_1_3, CENA_2_1, CENA_2_2, IL_1_1, IL_1_2 itd.

0

jak mu wskażesz tylko te pola, które chcesz to tylko te dostaniesz. Oczywiście, żeby napisać jaki silnik to już nie dało rady

0

hm... a jakieś strzępy zapytania byście mogli zaproponować, zupełnie nie wiem, jak to ugryźć. Jak do pivota przekazać - pobierz wszystko co zaczyna się od

 CENA_1_

i umieść jako osobne wiersze

Wszystkie zapytania, które znajdują mają po pierwsze sumowanie wartości danego typy i przede wszystkich pozycje mają zgodne nazwy. np. employer1

0

http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query
wystarczy to @cols = STUFF... wstawić warunek na kolumny _1_ albo _2_
tu jest nawet ładnie wytłumaczone http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/

0

Jeżeli doprowadzisz dane do postaci:

g        r        p        wartosc
-------- -------- -------- --------
1        1        CENA     120,00
1        2        CENA     50,00
1        3        CENA     20,00
2        1        CENA     100,00
2        2        CENA     20,00
1        1        IL       1000,000
1        2        IL       2,000
1        3        IL       1000,000
2        1        IL       500,000
2        2        IL       500,000
1        1        JM       m2
1        2        JM       szt.
1        3        JM       m2
2        1        JM       m2
2        2        JM       m2

to możesz zrobić ładnie pivota:

with cteE as (
select 
	substring(reverse(parametr),charindex('_',reverse(parametr))+1,charindex('_',reverse(parametr),charindex('_',reverse(parametr)))-1) g,
	right(parametr,charindex('_',reverse(parametr))-1) r,
	left(parametr,charindex('_',parametr)-1) p,
	wartosc
from tab)

select * from cteE
pivot (max(WARTOSC) for p in ([CENA],[IL],[JM])) as RV
ORDER BY 1,2

Wynik:

g        r        CENA     IL       JM
-------- -------- -------- -------- --------
1        1        120,00   1000,000 m2
1        2        50,00    2,000    szt.
1        3        20,00    1000,000 m2
2        1        100,00   500,000  m2
2        2        20,00    500,000  m2
0

bardzo dziękuję, sam bym tego nie ogarnął raczej, a dokładnie rozwiązuje to mój problem

0

Hej @Panczo, a czy można jakoś jeszcze rozpoznać numer indeksu inaczej niż charindex('',reverse(parametr))+1 i charindex('',reverse(parametr)))-1)? Mam w bazie dane CENA 1_1 i CENA_11_1, zapytanie

SELECT 
    SUBSTRING(reverse(parametr),charindex('_',reverse(parametr))+1,charindex('_',reverse(parametr),charindex('_',reverse(parametr)))-1) g,
    RIGHT(parametr,charindex('_',reverse(parametr))-1) r,
    LEFT(parametr,charindex('_',parametr)-1) p,
    wartosc
FROM tab

daje przez to w wyniku

1	1	CENA	50
1	1	CENA      150
0

charindex('_',reverse(replace(parametr,' ','_'))+1

0

dobra, nie było pytania, w zapytaniu @Panczo nie ma żadnego problemu, u siebie później zawężałem zapytanie w WHERE szukając "parameter like 'NAZWA_1_%'" chcąc wyświetlić tylko te ceny, które dotyczą kolumn z nazwą 1, a przecież underscore to w SQL znak specjalny, żeby użyć go jako chara w stringu trzeba napisać "parameter like 'NAZWA[]1[]%'"

może komuś to się przyda w przyszłości, więc zostawiam

0

chodziło o

parameter like 'NAZWA_1_%'

a w SQL podobnie, jak na tym forum, podkreślenie to znak specjalny i żeby wykorzystać go jako zwykły tekst trzeba wziąć w nawias kwadratowy

parameter like 'NAZWA[_]1[_]%'

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