2 votes

Insérer une seule ligne de données dans plusieurs lignes de tableau

Synopsis: Comment écrire le code SQL pour insérer un enregistrement d'un fichier plat dans des enregistrements distincts à insérer dans une table SQL Server.

Spécificités: J'ai une table pour enregistrer les paiements de location. Pour chaque contrat de location, la date d'échéance est toujours le premier jour du mois. Il y a une entrée dans la table pour chaque mois de la durée du bail. Pour simplifier, disons qu'il y a un contrat de location qui va du 1er septembre 2019 au 31 août 2020. La table ressemblerait à ceci:

+------------------------------------------------------+
| ID_CONTRAT  | DATE_ECHEANCE | ID_FACTURE | MONTANT_LOYER  |
+-------------+-------------+------------+-------------+
| 12345       |    1/9/2019 |            |             |
+-------------+-------------+------------+-------------+
| 12345       |   1/10/2019 |            |             |
+-------------+-------------+------------+-------------+
...
+-------------+-------------+------------+-------------+
| 12345       |    1/8/2020 |            |             |
+-------------+-------------+------------+-------------+

Les factures sont normalement pour un mois calendaire, mais parfois il peut y en avoir deux ou trois parce que le fournisseur est en retard. Les données sont reçues dans un fichier plat, un exemple ressemblerait à ceci:

Contrat  Période de location De la Date  Période de location À la Date  Numéro de Facture   Montant
31125      1/9/2019                  30/9/2019             6378            400,00  (scénario standard)
12345      1/9/2019                 30/11/2019             789             150,00  (scénario multi-mois)

Les données du fichier plat doivent être stockées dans trois enregistrements distincts dans la table:

+------------------------------------------------------+
| ID_CONTRAT | DATE_ECHEANCE | ID_FACTURE | MONTANT_LOYER  |
+-------------+-------------+------------+-------------+
| 12345       |    1/9/2019 |   789      |   50,00     |
+-------------+-------------+------------+-------------+
| 12345       |   1/10/2019 |   789      |   50,00     |
+-------------+-------------+------------+-------------+
| 12345       |   1/11/2019 |   789      |   50,00     |
+-------------+-------------+------------+-------------+

Merci d'avance.

2voto

JM_ Points 756

Vous pouvez essayer d'utiliser une CTE récursive. Considérez ceci :

CREATE TABLE #RawData(Contrat int, Période_de_location_de Date, Période_de_location_à Date, Numéro_de_facture int, Montant Decimal(10,2))
INSERT INTO #RawData VALUES(31225, '1/9/2019','30/9/2019', 6378,400.00)
INSERT INTO #RawData VALUES(12345, '1/9/2019','30/11/2019', 789,150.00)

;WITH CTE
AS
(
select Contrat,Période_de_location_de DueDate,Numéro_de_facture,Montant, 0 MonthCounter, Période_de_location_à from #RawData
UNION ALL
SELECT Contrat, DATEADD(month,MonthCounter+1,DueDate),Numéro_de_facture,Montant, MonthCounter,Période_de_location_à from CTE
WHERE DATEADD(month,MonthCounter+1,DueDate) <= Période_de_location_à

)
SELECT CONTRAT, DueDate,Numéro_de_facture, CAST(Montant / (SELECT COUNT(*) 
                FROM CTE t1 WHERE t1.Contrat = t2.Contrat ) as decimal(10,2)) Montant 
FROM CTE t2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X