Mam do czynienia z następującym wyzwaniem. Muszę obracać dane tabeli dwukrotnie w tej samej kolumnie. Oto zrzut ekranu z danymi.Czy jest możliwe posiadanie wielu osi za pomocą tej samej kolumny przestawnej przy użyciu serwera SQL Server
Chcę mieć jeden wiersz dla każdego identyfikatora produktu zawierającego zarówno wartość nabywczą i wartość sprzedaży każdego roku. Próbowałem to zrobić, wybierając dwukrotnie kolumnę "rok", formatując ją tak, aby każdy rok sprzedaży był poprzedzany prefiksem "S", a każdy rok zakupu zaczynał się od "P", a użycie 2 czopów obracało się w ciągu 2 lat kolumny. Oto zapytań SQL (używane w SQL Server 2008):
SELECT [Item ID],
[P2000],[P2001],[P2002],[P2003],
[S2000],[S2001],[S2002],[S2003]
FROM
(
SELECT [Item ID]
,'P' + [Year] AS YearOfPurchase
,'S' + [Year] AS YearOfSelling
,[Purchasing value]
,[Selling value]
FROM [ItemPrices]
) AS ALIAS
PIVOT
(
MIN ([Purchasing value]) FOR [YearOfPurchase] in ([P2000],[P2001],[P2002],[P2003])
)
AS pvt
PIVOT
(
MIN ([Selling value]) FOR [YearOfSelling] in ([S2000],[S2001],[S2002],[S2003])
)
AS pvt2
wynik nie jest dokładnie to, co miałem nadzieję (patrz zdjęcie poniżej):
Jak widać, istnieje wciąż jest więcej niż jeden wiersz dla każdego identyfikatora przedmiotu. Czy istnieje sposób na zmniejszenie liczby wierszy do dokładnie jednego elementu? Aby wyglądało trochę jak zrzut ekranu Excel poniżej?
Dzięki za sugestię unpivot. To mi nie przyszło do głowy (i nie jestem pewien, czy miałoby to w przyszłości :-)) –
@RobVermeulen Ta funkcja unpivot działa świetnie. Właśnie zaktualizowałem swoją odpowiedź wersją, która również używa "cross apply". Obie uzyskają taki sam wynik. – Taryn
Czy "zastosowanie krzyżowe" byłoby szybsze? –