Pivot Record InLine

Sono tre giorni che sbatto la testa sulle query. Piccola premessa : ho sempre odiato lavorare direttamente sul db quindi queste cose ho sempre cercato di delegarle…🙂 Però questa volta purtroppo ho dovuto sbatterci la testa.

Problema:
Devo stampare delle tessere (badge) fronte-retro. Sul lato frontale ho i dati della tabella intestazione mentre sul retro devo avere la lista di tutti gli utenti che sono in relazione con la tabella di intestazione; direte “tutto facile”, con una join si risolve tutto…. Unico problema è il fatto che l’applicativo di stampa non gestisce join tra tabelle ma ogni scheda equivale ad un record. Quindi devo cercare avere i miei record raggruppati per Id su un’unica riga.


Il risultato visivo è il seguente:
Dati in forma tabellare:
Id | Nome | Cognome|Indirizzo
1|Mario|Bianchi|via aaaa
2|Luigi|Rossi|via bbb
3|Anna|Verde|via ccc
4|Cristina|Venti|via dddd

Risultato richiesto:
Id|Intestatario1|DatiIntestatario1|Intestatario2|DatiIntestatario2|Intestatario3DatiIntestatario3
1|Mario Bianchi|via aaaa|Luigi Rossi|via bbb|Anna Verde|via ccc
2|Cristina Venti|via ddd|NULL|NULL|NULL|NULL

Risultato:

Il risultato di giorni di pensiero e di prove è il seguente:

SELECT
IdIntestazioneTicket
, [Intestatario1] = max(case when RowID = 1 then IntestazioneParente end)
, [DatiIntestatario1] = max(case when RowID = 1 then DatiParenti end)
, [Intestatario2] = max(case when RowID = 2 then IntestazioneParente end)
, [DatiIntestatario2] = max(case when RowID = 2 then DatiParenti end)
, [Intestatario3] = max(case when RowID = 3 then IntestazioneParente end)
, [DatiIntestatario3] = max(case when RowID = 3 then DatiParenti end)
FROM
(
SELECT
IdIntestazioneTicket,
RowID = (ROW_NUMBER() OVER(PARTITION BY IdIntestazioneTicke ORDER BY IdIntestazioneTicket DESC))
,Nome + ' ' + Cognome as IntestazioneParente, ' - nato a ' + LuogoNascita + ' il ' +
CONVERT(nvarchar(30), DataNascita, 103) as DatiParenti
FROM
TicketFamily_Parenti
) SourceTable
GROUP BY
IdIntestazioneTicket

Questa è una soluzione veloce anche se brutta da vedere. Se qualcuno ha altri modi più eleganti per risolvere il problema, dica pure….

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...