Przeczytałem rzeczy na temat tabel przestawnych MS i nadal mam problemy z uzyskaniem tego poprawnego.
Mam tabelę tymczasową, która jest tworzona, powiemy, że kolumna 1 to numer sklepu, a kolumna 2 to numer tygodnia, a na koniec kolumna 3 to w sumie jakiś typ. Również liczby tygodni są dynamiczne, numery sklepów są statyczne.
Store Week xCount
------- ---- ------
102 1 96
101 1 138
105 1 37
109 1 59
101 2 282
102 2 212
105 2 78
109 2 97
105 3 60
102 3 123
101 3 220
109 3 87
Chciałbym, aby wyszedł jako stół przestawny, taki jak ten:
Store 1 2 3 4 5 6....
-----
101 138 282 220
102 96 212 123
105 37
109
Przechowuj numery z boku, a tygodnie u góry.
sql
sql-server
pivot
pivot-table
Lynn
źródło
źródło
Odpowiedzi:
Jeśli korzystasz z programu SQL Server 2005+, możesz użyć
PIVOT
funkcji do przekształcenia danych z wierszy w kolumny.Wygląda na to, że będziesz musiał użyć dynamicznego SQL, jeśli tygodnie są nieznane, ale łatwiej jest zobaczyć poprawny kod, używając początkowo wersji na stałe.
Po pierwsze, oto kilka szybkich definicji tabel i danych do użycia:
Jeśli twoje wartości są znane, wówczas na stałe zakodujesz zapytanie:
Zobacz prezentację SQL
Jeśli chcesz dynamicznie wygenerować numer tygodnia, Twój kod będzie:
Zobacz prezentację SQL .
Wersja dynamiczna generuje listę
week
liczb, które należy przekonwertować na kolumny. Oba dają ten sam wynik:źródło
cte3 AS (select ... )
wtedy masz zdefiniowaną powyżej logikę za pomocą@cols
i@query
... wystąpił błąd. Niepoprawna nazwa obiektu „cte3”. jak to naprawić. -STUFF(...)
(aniXML PATH
jednego z nich). Z korzyścią dla innych czytelników wystarczy połączyć nazwy kolumn i odciąć przecinek wiodący. Uwaga: Myślę, że następujące czynności są nieco prostsze: wybierz @cols = (WYBIERZ NAZWĘ ODNIESIENIA (Tydzień) + ',' z zamówienia o 1 dla ŚCIEŻKI XML ('')) ustaw @cols = SUBSTRING (@cols, 1, LEN ( @cols) - 1) ... zastępującgroup by
przezdistinct
aorder by 1
i ręczne siekanie z dodaną literą przecinek!Odbywa się to przez dynamiczną liczbę tygodni.
Pełny przykład tutaj: SQL Dynamic Pivot
źródło
Osiągnąłem to samo wcześniej, używając podkwerend. Więc jeśli twoja oryginalna tabela nazywała się StoreCountsByWeek, a ty miałeś osobną tabelę, która zawierała identyfikatory sklepu, to wyglądałoby to tak:
Zaletą tej metody jest to, że składnia jest bardziej przejrzysta i ułatwia przyłączanie się do innych tabel, aby również przyciągać inne pola do wyników.
Moje anegdotyczne wyniki są takie, że uruchomienie tego zapytania w kilku tysiącach wierszy wykonanych w czasie krótszym niż jedna sekunda, a tak naprawdę miałem 7 podkwerend. Ale jak zauważono w komentarzach, zrobienie tego w ten sposób jest bardziej kosztowne obliczeniowo, więc należy zachować ostrożność przy stosowaniu tej metody, jeśli oczekuje się, że będzie działać na dużych ilościach danych.
źródło
Oto, co możesz zrobić:
PRÓBNY
źródło
Piszę sp, który może być przydatny do tego celu, w zasadzie ten sp przestawia dowolną tabelę i zwraca nową tabelę przestawną lub zwraca tylko zestaw danych, oto sposób jej wykonania:
pamiętaj, że w parametrze @agg nazwy kolumn muszą być z
'['
a parametr musi kończyć się przecinkiem','
SP
To jest przykład wykonania:
wtedy
Select * From ##TEMPORAL1PVT
wróci:źródło
źródło
Oto wersja powyższej odpowiedzi @Tayrn, która może ułatwić zrozumienie przestawiania:
To może nie być najlepszy sposób, aby to zrobić, ale to pomogło mi owinąć głowę, jak przestawić tabele.
ID = wiersze, które chcesz przestawić
MY_KEY = kolumna, którą wybierasz z oryginalnej tabeli, która zawiera nazwy kolumn, które chcesz przestawić.
VAL = wartość, którą chcesz zwrócić pod każdą kolumną.
MAX (VAL) => Można zastąpić innymi funkcjami agregującymi. SUMA (VAL), MIN (VAL), ETC ...
źródło
Po prostu daj ci pojęcie, jak inne bazy danych rozwiązują ten problem.
DolphinDB
ma także wbudowaną obsługę przestawiania, a sql wygląda na bardziej intuicyjny i schludny. Jest to tak proste, jak określenie kolumny kluczowej (Store
), kolumny przestawnej (Week
) i obliczonej metryki (sum(xCount)
).DolphinDB to kolumnowa, wysokowydajna baza danych. Obliczenia w wersji demo kosztują zaledwie 546 ms na laptopie Dell XPS (i7 CPU). Aby uzyskać więcej informacji, zapoznaj się z instrukcją online DolphinDB https://www.dolphindb.com/help/index.html?pivotby.html
źródło