pregunta loca SQL: Cómo hacer una especie de mezcla se aplica con un pivote?
-
18-09-2019 - |
Pregunta
El cliente tiene accesos directos en sus datos en los que tienen un cantidad de registros en un campo. Cuando les analizo, necesito para la fabricación de registros, uno para cada cantidad, incrementando el "identificador" por 7 días (debido a que el número representa una fecha
Ejemplo:. Un solo producto que está a la venta durante cuatro semanas y necesito cuatro discos, un producto para cada semana.
[Número de evento]
[Clasificación]
[Semanas Operando]
[Algunos datos]
2009 11 29 00
1
1
dirige uno la semana
2009 12 06 00
2
1
dirige uno la semana
2009 12 13 00
1
4
ejecuta cuatro semanas
2009 12 20 00
2
4
ejecuta cuatro semanas
De alguna manera tengo que convertir estos datos en la siguiente con el fin de (SQL SELECT) (todos en la misma mesa, incluidos los espacios en blanco para ver partes:
[Número de evento + Clasificación]
[Algunos datos]
2009 11 29 01
ejecute una semana Una semana de este modo un registro.
2009 12 06 02
ejecute una semana
2009 12 13 01
tiene una duración de cuatro semanas Se repite 4 veces la fecha por incremento a 7
2009 12 20 01
tiene una duración de cuatro semanas
2009 12 27 01
tiene una duración de cuatro semanas
2009 01 03 01
tiene una duración de cuatro semanas
2009 12 20 02
tiene una duración de cuatro semanas Se repite 4 veces la fecha por incremento a 7
2009 12 27 02
tiene una duración de cuatro semanas
2009 01 03 02
tiene una duración de cuatro semanas
2009 01 10 02
tiene una duración de cuatro semanas
Mis pensamientos van a tener algún tipo de cruz de pivote aplicar el código SQL?
Solución
Tengo una respuesta barato para usted. Utiliza una tabla Weeks
"pre-renderizados" para crear un bucle basado en consultas. Usted tendría que poner bastantes semanas en él para cubrir el rango esperado de escenarios.
[Week]
1
2
3
4
A continuación, se une a su consulta en [Weeks Running]
a esta tabla, utilizando el OriginalTable.WeeksRunning <= Weeks.Week
desigualdad. Se termina con una fila por semana.
deducir la fecha mediante la adición de días Weeks.Week * 7
a la fecha incrustado en el número de evento.
Otros consejos
Esto es algo que probablemente sería más fácil de hacer en aplicación del lado en vez de lado la base de datos, pero voy a darle un tiro ... Esto requiere una base de datos de soporte CTE, lo cual no sucede que tiene en la mano, así que esto no se ha probado.
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;