SQL Server 2012 – Réduire 12 Union tout en une requête avec une colonne personnalisée

J'ai une question SQL Server 2012 concernant UNION All. J'ai inclus le code. Je m'excuse pour la pratique terriblement codante. Toujours nouveau à ce sujet.

Fondamentalement, dans la table source, il n'y a pas de champ de date, mais un champ Numéro de produit. J'ai besoin de voir le numéro de produit apparaître une fois pour chaque date, soit 14 jours en arrière d'aujourd'hui.

La colonne Date dans ce cas doit être une colonne Personnalisée créée par moi-même. La seule façon de le faire fonctionner était de faire une union tout puis augmenter d'un jour pour chaque requête afin d'get les loggings dont j'avais besoin, le numéro de produit apparaissant une fois pour chaque date. En bref, chaque numéro de produit devrait montrer 14 fois différentes.

Curieux s'il y a une autre façon d'écrire ceci sans faire des procédures stockées ou créer des tables.

select Product_Number ,cast(GETDATE() -1 as date) DateKey from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -2 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -3 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -4 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -5 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -6 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -7 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -8 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -9 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -10 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -11 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -12 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -13 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' union all select Product_Number ,cast(GETDATE() -14 as date) from Test.dbo.PRODUCT_MASTER_0001_PM Where ACTIVE = 'Y' 

Toute aide est appréciée.

Merci beaucoup

Essaye ça:

 SELECT t2.Product_Number, t1.dateField FROM ( VALUES (CAST(GETDATE() - 1 AS DATE)), (CAST(GETDATE() - 2 AS DATE)), (CAST(GETDATE() - 3 AS DATE)), (CAST(GETDATE() - 4 AS DATE)), ... (CAST(GETDATE() - 13 AS DATE)), (CAST(GETDATE() - 14 AS DATE))) AS t1(dateField) CROSS JOIN ( SELECT Product_Number FROM Test.dbo.PRODUCT_MASTER_0001_PM WHERE ACTIVE = 'Y') AS t2(Product_Number) 

La requête ci-dessus utilise un constructor de valeur de table pour créer une table en ligne contenant tous les 14 jours qui remontent à la date d'aujourd'hui. Ensuite, avec CROSS JOIN nous pouvons combiner ces dates avec Product_Number pour get le jeu de résultats requirejs.

 WITH cte_rec AS ( SELECT 1 AS num UNION ALL SELECT num + 1 AS num FROM cte_rec WHERE num < 15 ) SELECT GETDATE() - num AS date, p.Product_Number FROM cte_rec CROSS APPLY PRODUCT_MASTER_0001_PM p WHERE p.ACTIVE='Y' 

Explication: cte_rec – récursivité pour get les nombres de 1 à 14. GETDATE () – nombre – comme d'habitude. Cross apply affichera les dates avec chaque numéro de produit.

Quoi de mieux de la réponse ci-dessus – vous pouvez facilement changer le nombre de jours.