Stworzyłem tabelę o nazwie „Tabela 2”, zawierające dane, które zostały pokazane powyżej pod nagłówkiem tabeli 2.
Oto SQL użyłem w SQL Server 2008.
WITH RankedValues AS
(
SELECT
FID AS ID,
YearS,
ROW_NUMBER() OVER(PARTITION BY FID ORDER BY YearS) AS YearSRank,
Val
FROM
Table2
)
SELECT
ID,
MAX((CASE WHEN YearSRank = 1 THEN YearS ELSE 0 END)) AS Yr1,
MAX((CASE WHEN YearSRank = 1 THEN Val ELSE '' END)) AS Val1,
MAX((CASE WHEN YearSRank = 2 THEN YearS ELSE 0 END)) AS Yr2,
MAX((CASE WHEN YearSRank = 2 THEN Val ELSE '' END)) AS Val2,
MAX((CASE WHEN YearSRank = 3 THEN YearS ELSE 0 END)) AS Yr3,
MAX((CASE WHEN YearSRank = 3 THEN Val ELSE '' END)) AS Val3,
MAX((CASE WHEN YearSRank = 4 THEN YearS ELSE 0 END)) AS Yr4,
MAX((CASE WHEN YearSRank = 4 THEN Val ELSE '' END)) AS Val4
FROM
RankedValues
GROUP BY
ID
Powyższy SQL spowoduje to:
ID Yr1 Val1 Yr2 Val2 Yr3 Val3 Yr4 Val4
---------------------------------------------------------------------
1 2008 Up 2009 Down 2010 Up 0
2 2000 Up 2001 Down 2002 Up 2003 Up
3 2009 Down 2010 Up 0 0
Powodem nie widać NULL
wartości jest ze względu na ELSE
w każdym oświadczeniu CASE
. Jeśli wolisz mieć wartości NULL
, usuń po prostu ELSE 0
i ELSE ''
zgodnie z wymaganiami.
Nie wiem w tej chwili, czy jest możliwe wykonanie tego rodzaju, np .: przetwarzanie nieznanej ilości różnych FID, ponieważ oznaczałoby to również generowanie nazw kolumn (Yr1, al1, Yr2 itd.) ogólnie.
Można to osiągnąć dzięki dynamicznemu SQL, ale ponieważ nie jestem wielkim fanem dynamicznego SQL, spróbowałbym zbadać inny sposób radzenia sobie z tym.
- Edycja (podejście Dodany pivot dla kompletności) -
Spojrzałem na link Joe Stefanelli pisał i dodałem SQL poniżej dla Państwa wymagań. Chociaż nie podoba mi się idea dynamicznego SQL, nie mogłem znaleźć żadnego innego sposobu w tym konkretnym przypadku.
DECLARE @query VARCHAR(4000)
DECLARE @years VARCHAR(2000)
SELECT @years = STUFF((
SELECT DISTINCT
'],[' + ltrim(str(YearS))
FROM Table2
ORDER BY '],[' + ltrim(str(YearS))
FOR XML PATH('')), 1, 2, '') + ']'
SET @query =
'SELECT * FROM
(
SELECT FID AS ID,YearS,Val
FROM Table2
) AS t
PIVOT (MAX(Val) FOR YearS IN (' + @years + ')) AS pvt'
EXECUTE (@query)
Spowoduje to follwing:
ID 2000 2001 2002 2003 2008 2009 2010
---------------------------------------------------------
1 NULL NULL NULL NULL Up Down Up
2 Up Down Up Up NULL NULL NULL
3 NULL NULL NULL NULL NULL Down Up
zależności w jakim formacie i podejście lubisz najbardziej, przynajmniej masz opcje wyłożone na zewnątrz.
Skorzystaj z programu Report Builder do tworzenia raportów! –
czy istnieje powód, dla którego miałbyś mieć dwie kolumny rocznie zamiast na rok podać nazwę kolumny? w ten sposób wszystkie twoje lata są pogrupowane. – DForck42