Fou question SQL: Comment faire une sorte de croix appliquer avec un pivot?
-
18-09-2019 - |
Question
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?
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;