Question

Client

a des raccourcis dans leurs données où ils ont une quantité d'enregistrements dans un champ. Quand je les parser, je dois fabriquer des disques, un pour chaque quantité, incrémenter le « identifiant » de 7 jours (parce que le nombre représente une date
Exemple:. Un seul produit qui est en vente pendant quatre semaines et je besoin de quatre disques, un produit pour chaque semaine.

[Numéro d'événement] [Classement] [Semaines en cours] [Certaines données]
2009 11 29 00 1 1 exécute un semaine
2009 12 06 00 2 1 exécute un semaine
2009 12 13 00 1 4 exécute quatre semaines
2009 12 20 00 2 4 exécute quatre semaines

D'une certaine manière je dois transformer ces données en ce qui suit en vue (sql select) (tous dans la même table, espace blanc inclus pour voir les parties:

[Numéro d'événement + Classification] [Certaines données]
2009 11 29 01 dure une semaine Une semaine ainsi un enregistrement.
2009 12 06 02 court pendant une semaine
2009 12 13 01 court pendant quatre semaines Répète 4 fois la date incrémente de 7
2009 12 20 01 est de quatre semaines
2009 12 27 01 est de quatre semaines
2009 01 03 01 est de quatre semaines
2009 12 20 02 court pendant quatre semaines Répète 4 fois la date incrémente de 7
2009 12 27 02 est de quatre semaines
2009 01 03 02 est de quatre semaines
2009 01 10 02 court pendant quatre semaines

Mes pensées sont d'avoir une sorte de croix de pivot appliquer le code sql?

Était-ce utile?

La solution

J'ai une réponse pas cher pour vous. Vous utilisez un « pré-rendu » table Weeks pour créer une boucle basée sur une requête. Vous auriez besoin de mettre suffisamment de semaines pour en couvrir votre gamme prévue de scénarios.

[Week]
1
2
3
4

Ensuite, vous vous joignez à votre requête sur [Weeks Running] à cette table, en utilisant la OriginalTable.WeeksRunning <= Weeks.Week d'inégalité. Vous vous retrouvez avec une ligne par semaine.

Vous déduisez la date en ajoutant jours Weeks.Week * 7 à la date a été intégrée dans votre numéro d'événement.

Autres conseils

Ceci est quelque chose qui serait probablement plus simple à faire sur côté application plutôt que la base de données côté, mais je vais donner un coup de feu ... Cela nécessite une base de données supportant CTEs, que je ne disposeriez pas sur Par contre, il en est ainsi non testé.

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top