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?

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top