Walczę z poleceniami univot i pivot, ale nie mogę tego naprawić. Chcę dokonać transpozycji przy użyciu języka Transact SQL z tabeli 1 do tabeli 2:
kliknij tutaj, aby zobaczyć moje tabele źródłowe i docelowe
Jak mogę to zrobić? Do tej pory doszedłem do tego:
SELECT CASE RIGHT(name, 1) WHEN "R" THEN CONVERT(nvarchar(6), Q) + "R"
WHEN "D" THEN CONVERT(nvarchar(6), Q) + "D"
ELSE CONVERT(nvarchar(6), Q) + "A" END AS Q1,
value, name
FROM (SELECT Q, a1VAT, b1VAT, c1VAT, a1VATR, b1VATR, c1VATR, a1VATD, b1VATD, c1VATD
FROM vw_VAT) src
unpivot (value FOR name IN (a1VAT, b1VAT, c1VAT, a1VATR, b1VATR, c1VATR, a1VATD, b1VATD, c1VATD)) sel
pivot ???
Ale polecenie pivot nie może się naprawić. Czy ktoś może mi pomóc?
BR, emphyrio
Odpowiedzi:
0 dla odpowiedzi № 1Rozwiązałem zagadkę samodzielnie, używając tego T-SQL:
SELECT * FROM (
SELECT CASE RIGHT(name, 1) WHEN "R" THEN CONVERT(nvarchar(6), Q) + "R"
WHEN "D" THEN CONVERT(nvarchar(6), Q) + "D"
ELSE CONVERT(nvarchar(6), Q) + "A" END AS Q1,
CASE RIGHT(name, 1) WHEN "R" THEN LEFT(name, LEN(name) -1)
WHEN "D" THEN LEFT(name, LEN(name) -1)
ELSE name END AS name,
value
FROM (SELECT Q, a1VAT, b1VAT, c1VAT, a1VATR, b1VATR, c1VATR, a1VATD, b1VATD, c1VATD
FROM vw_VAT) src
unpivot (value FOR name IN (a1VAT, b1VAT, c1VAT, a1VATR, b1VATR, c1VATR, a1VATD, b1VATD, c1VATD)) up) main
pivot (SUM(value) FOR Q1 IN ([201501A], [201502A], [201503A], [201504A], [201501R], [201502R], [201503R], [201504R], [201501D], [201502D], [201503D], [201504D])) piv
Teraz pozostaje tylko dynamiczna zmiana klauzuli IN komendy przestawnej. Ale to jest łatwe, teraz znalazłem rozwiązanie.
Emphyrio.