Witam,
Poproszę Was o pomoc, ponieważ utknąłem :-(.
Serwer SQL 2012.
Zrobiłem "klasycznego" Pivota..., działa bez problemu, ale nie jest dynamiczny (ilość i opisy kolumn).
Select *
FROM
-- Wyrażenie z danymi.
(
SELECT DISTINCT
dbo.MULG_SL_ZAWARTOSC.SLZW_TRESC AS GR_ZAM,
MULG_SL_ZAWARTOSC1.SLZW_TRESC AS GR_TECHN,
VRP_SPRZ_KOR_MG_SUMA_WZ.SPRZ_DATA_SPRZ AS DATA_SP,
TOWARY1.TWR_NUMER AS GR_NUMER,
TOWARY1.TWR_NAZWA AS GR_NAZWA,
TOWARY.TWR_NUMER AS NUMER,
TOWARY.TWR_NAZWA AS NAZWA,
SUM(VRP_SPRZ_KOR_MG_SUMA_WZ.VRPILWAR_ILOSC_KG) AS KG
FROM
VRP_SPRZ_KOR_MG_SUMA_WZ
INNER JOIN TOWARY ON (VRP_SPRZ_KOR_MG_SUMA_WZ.WZN_TWR_ID = TOWARY.TWR_ID)
LEFT OUTER JOIN dbo.TWR_GRUPY ON (TOWARY.TWR_ID = dbo.TWR_GRUPY.TWRGR_TWR_ID)
LEFT OUTER JOIN dbo.MULG_SL_ZAWARTOSC ON (dbo.TWR_GRUPY.TWRGR_SLZW_ID = dbo.MULG_SL_ZAWARTOSC.SLZW_ID)
LEFT OUTER JOIN dbo.MULG_SLOWNIKI ON (dbo.MULG_SL_ZAWARTOSC.SLZW_SL_ID = dbo.MULG_SLOWNIKI.SL_ID)
INNER JOIN dbo.MULG_SL_ZAWARTOSC MULG_SL_ZAWARTOSC1 ON (TOWARY.TWR_ID_TECH = MULG_SL_ZAWARTOSC1.SLZW_ID)
INNER JOIN dbo.TOWARY TOWARY1 ON (TOWARY.TWR_WYROB_ID = TOWARY1.TWR_ID)
WHERE
SPRZ_FLA_ID = 1 AND
WZN_USLUGA = 'N' AND
(dbo.TWR_GRUPY.TWRGR_SL_ID IS NULL OR
dbo.TWR_GRUPY.TWRGR_SL_ID = 265) AND
-- Ograniczenie aby nie "orać" serwera, na testach.
SPRZ_DATA_SPRZ >= '2017-01-22' AND
SPRZ_DATA_SPRZ <= '2017-01-24'
AND TOWARY1.TWR_NUMER IN (92700,70160)
GROUP BY
dbo.MULG_SL_ZAWARTOSC.SLZW_TRESC,
MULG_SL_ZAWARTOSC1.SLZW_TRESC,
TOWARY.TWR_NUMER,
TOWARY.TWR_NAZWA,
TOWARY1.TWR_NUMER,
TOWARY1.TWR_NAZWA,
VRP_SPRZ_KOR_MG_SUMA_WZ.SPRZ_DATA_SPRZ
HAVING
SUM(VRP_SPRZ_KOR_MG_SUMA_WZ.VRPILWAR_WARTOSC_NETTO) <> 0
) AS TEMP_PVT
-- Tworzymy PIVOT.
PIVOT
(SUM(KG) FOR DATA_SP IN ([2017.01.23],[2017.01.24])
) AS PVT
Ale chciałbym aby opisy kolumn "dobierały się" automatycznie.
I mam z tym problem...
Nazwy kolumn to podzapytanie (Z dużą ilością powtórzeń dlatego Distinct).
Select DISTINCT
Convert(Date, SPRZ_DATA_SPRZ)
-- Zmiana daty na yyyy-mm-dd aby pasowała do opisów kolumn zwracanych w zapytaniu głównym.
FROM
VRP_SPRZ_KOR_MG_SUMA_WZ
WHERE
VRP_SPRZ_KOR_MG_SUMA_WZ.SPRZ_FLA_ID = 1 AND
VRP_SPRZ_KOR_MG_SUMA_WZ.WZN_USLUGA = 'N' AND
VRP_SPRZ_KOR_MG_SUMA_WZ.SPRZ_DATA_SPRZ >= '2017-01-21' AND
VRP_SPRZ_KOR_MG_SUMA_WZ.SPRZ_DATA_SPRZ <= '2017-01-24')
Mogę poprosić bardziej doświadczonych użytkowników o pomoc i wytłumaczenie jak to połączyć?
Próbowałem z samouczków z internetu ale cały czas mam błąd.
- przy zmiennej, że dużo powtórzeń
- lub z wczytaniem do ([2017.01.23],[2017.01.24]) nie rozpoznaje tego co piszę.
Chciałbym zrozumieć w czym tkwi problem.
Klasyczny piwot to mniej więcej taka struktura zapytania, i to mi działa.
Select *
FROM
-- Wyrażenie z danymi.
(
"Klasyczny" Select
) AS TEMP_PVT
-- Tworzymy PIVOT.
PIVOT
(SUM(KG) FOR DATA_SP IN ([2017.01.23],[2017.01.24])
"Pole do danych" FOR "Nazwa kolumny dla opisów kolumn" IN ("Opisy kolumn")
) AS PVT