ho creato una tabella chiamata "Table2", contenente i dati che avete mostrato in precedenza sotto la rubrica Tabella 2.
Ecco l'SQL che ho usato in 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
È possibile che SQL si tradurrà in questo:
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
La ragione per cui non si vede NULL
valori è a causa del ELSE
in ciascuna istruzione CASE
. Se si preferiscono valori NULL
, rimuovere semplicemente ELSE 0
e ELSE ''
come richiesto.
Al momento non so se è possibile rendere questo generico, ad esempio: elaborare una quantità sconosciuta di FID distinti, poiché ciò significherebbe anche generare i nomi delle colonne (Yr1, al1, Yr2, ecc.) genericamente.
È possibile raggiungere questo obiettivo con SQL dinamico ma, poiché non sono un grande fan dell'SQL dinamico, proverei a cercare un altro modo di gestirlo.
- Modifica (Added approccio perno per completezza) -
Ho guardato il link Joe Stefanelli postato e ho aggiunto lo SQL di seguito per il vostro requisito. Anche se non mi piace l'idea di SQL dinamico non sono riuscito a trovare nessun altro modo in questa specifica istanza.
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)
Ciò comporterà il 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
A seconda che formato e avvicinarsi a voi piace di più, almeno hai le opzioni in fila fuori.
Utilizzare Report Builder per creare report! –
c'è un motivo per cui avresti due colonne all'anno invece di avere l'anno il nome della colonna? in questo modo tutti i tuoi anni sono raggruppati. – DForck42