/ / Più righe di dati in una singola riga - SQL Server - sql, sql-server

Più righe di dati in un'unica riga: SQL Server - sql, sql-server

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 № 1

Prova 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.