domanda Pazzo SQL: Come fare una sorta di incrocio applicare con un perno?
-
18-09-2019 - |
Domanda
Cliente ha scorciatoie nel loro dati in cui hanno un quantità di record in un campo. Quando li ho parse, ho bisogno per la fabbricazione di dischi, uno per ogni quantità, incrementando il "identificatore" di 7 giorni (perché il numero rappresenta una data
. Esempio: un unico prodotto che è in vendita per quattro settimane e ho bisogno di quattro record, un prodotto per ogni settimana.
[Numero evento]
[Classificazione]
[Settimane in corso]
[Alcuni dati]
2009 11 29 00
1
1
corre uno settimana
2009 12 06 00
2
1
corre uno settimana
2009 12 13 00
1
4
corre quattro settimane
2009 12 20 00
2
4
corre quattro settimane
In qualche modo ho bisogno di trasformare questi dati in quanto segue con vista (SQL SELECT) (tutti nella stessa tabella, lo spazio bianco incluso per vedere le parti:
[Numero Evento + Classificazione]
[Alcuni dati]
2009 11 29 01
corre per una settimana Per una settimana quindi un record.
2009 12 06 02
corre per una settimana
2009 12 13 01
corre per quattro settimane ripete 4 volte data l'incremento del 7
2009 12 20 01
corre per quattro settimane
2009 12 27 01
corre per quattro settimane
2009 01 03 01
corre per quattro settimane
2009 12 20 02
corre per quattro settimane ripete 4 volte data l'incremento del 7
2009 12 27 02
corre per quattro settimane
2009 01 03 02
corre per quattro settimane
2009 01 10 02
corre per quattro settimane
I miei pensieri sono per avere una sorta di perno croce applicare il codice sql?
Soluzione
ho una risposta a buon mercato per voi. Si utilizza un "pre-renderizzati" tavolo Weeks
per creare un ciclo basato su query. Si avrebbe bisogno di mettere abbastanza settimane in esso per coprire la gamma di scenari previsto.
[Week]
1
2
3
4
Poi si uniscono la query su [Weeks Running]
a questa tabella, utilizzando il OriginalTable.WeeksRunning <= Weeks.Week
disuguaglianza. Si finisce con una riga per ogni settimana.
È dedurre la data con l'aggiunta di giorni Weeks.Week * 7
alla data incorporato nel numero di evento.
Altri suggerimenti
Questo è qualcosa che probabilmente sarebbe più semplice da fare su richiesta lato piuttosto che del database-side, ma ho deciso di dargli un colpo ... Questo richiede un database di supporto CTE, che non mi capita di avere il mano, quindi questo non è testato.
WITH RECURSIVE expandedTable(eventNumber, classification, index, count, someData)
AS (
SELECT eventNumber, classification, 1, weeksRunning, someData
FROM originalTable
WHERE weeksRunning > 0
UNION ALL
SELECT eventNumber + 7, classification, index + 1, count, someData
FROM expandedTable
WHERE index < count
)
SELECT eventNumber, classification, someData
FROM expandedTable;