Ho un tavolo che assomiglia un po 'a questo
ID NAME MODULE STARTDATE ENDDATE MARK
123456 J Bloggs Module 1 13/01/2014 30/04/2014 FAIL
123456 J Bloggs Module 1 13/05/2014 30/08/2014 FAIL
123456 J Bloggs Module 1 13/09/2014 30/12/2014 PASS
123456 J Bloggs Module 2 13/05/2014 30/08/2014 PASS
123456 J Bloggs Module 3 13/01/2015 30/04/2015 FAIL
234567 A Test Module 1 13/01/2014 30/04/2014 PASS
234567 A Test Module 2 13/05/2014 30/08/2014 FAIL
234567 A Test Module 2 13/09/2014 30/12/2014 PASS
La tabella contiene grandi quantità di dati, similiin struttura a questo. Quello che sto cercando di fare è quasi concatenare alcuni dei dati da più righe in una struttura a riga singola basata sullo studente e sul modulo preso, quindi il risultato finale sarebbe simile a
ID NAME MODULE ENDDATE1 ENDDATE2 ENDDATE3 MARK
123456 J Bloggs Module 1 30/04/2014 30/08/2014 30/12/2014 PASS
123456 J Bloggs Module 2 30/08/2014 PASS
123456 J Bloggs Module 3 30/04/2015 FAIL
234567 A Test Module 1 30/04/2014 PASS
234567 A Test Module 2 30/08/2014 30/12/2014 PASS
Quindi la nuova tabella mostrerebbe tutte le date di finesulla stessa riga in base al modulo, quindi verrà visualizzato il segno più recente "max (Mark)". È probabile che ci siano più di 3 Date di fine possibili, come mostrato nella tabella di esempio, poiché ciò dipenderà interamente dalla tabella originale e dal numero di volte in cui uno studente potrebbe aver dovuto "reinserire" un modulo (potrebbe essere fino a 4/5 volte in alcuni casi).
risposte:
0 per risposta № 1Prova a utilizzare Dynamic Pivot:
IF(OBJECT_ID("tempdb..#table") IS NOT NULL)
DROP TABLE #TABLE
CREATE TABLE #TABLE (ID INT, NAME VARCHAR(30),MODULE VARCHAR(30),STARTDATE VARCHAR(30),ENDDATE VARCHAR(30),MARK VARCHAR(30))
INSERT INTO #TABLE VALUES
(123456, "J Bloggs", "Module 1", "13/01/2014", "30/04/2014", "FAIL"),
(123456, "J Bloggs", "Module 1", "13/05/2014", "30/08/2014", "FAIL"),
(123456, "J Bloggs", "Module 1", "13/09/2014", "30/12/2014", "PASS"),
(123456, "J Bloggs", "Module 2", "13/05/2014", "30/08/2014", "PASS"),
(123456, "J Bloggs", "Module 3", "13/01/2015", "30/04/2015", "FAIL"),
(234567, "A Test", "Module 1", "13/01/2014", "30/04/2014", "PASS"),
(234567, "A Test", "Module 2", "13/05/2014", "30/08/2014", "FAIL"),
(234567, "A Test", "Module 2", "13/09/2014", "30/12/2014", "PASS")
DECLARE @Columns VARCHAR(MAX)
SELECT @Columns = STUFF((SELECT "," + "[" + CONVERT(VARCHAR(30), number, 121) + "]"
FROM master..spt_values N
WHERE n.number BETWEEN 1 AND (SELECT TOP 1 COUNT(Enddate)
FROM #TABLE
GROUP BY ID,NAME,MODULE
ORDER BY COUNT(Enddate) DESC)
AND TYPE = "P"
FOR XML PATH("")), 1, 1, "")
DECLARE @sql NVARCHAR(MAX) = "
SELECT ID,
NAME,
MODULE,
"+@Columns+",
(SELECT TOP 1 MARK
FROM #table t1
WHERE pvt.ID = t1.ID
AND pvt.NAME = t1.NAME
AND pvt.MODULE = t1.MODULE
ORDER BY enddate DESC) AS MARK
FROM (SELECT ID,
NAME,
MODULE,
ENDDATE,
ROW_NUMBER()
OVER(
partition BY ID, NAME, MODULE
ORDER BY enddate) AS rn
FROM #table) t
PIVOT ( Max(ENDDATE)
FOR rn IN("+@Columns+")) AS pvt
"
EXEC sp_executeSQL @sql
Controlla i dettagli di Pivot e Unpivot Qui.
NOTA: come puoi vedere, ho usato una query secondaria per trovare le ultime Mark
. Ho fatto del mio meglio per sostituirlo con qualcosa di meglio, ma non potevo. Tuttavia, funzionerà per te.