Cette requête:
SELECT nettprice ,prodgroup ,numofitems ,duedate ,traderid ,duestring FROM db.dbo.v_activesalesorder WHERE prodgroup IN ( '123', '456', '789') AND traderid = 'CUST01'
Renvoie ces résultats
De quoi aurais-je besoin à ajouter à ma requête SQL pour générer une ligne pour chaque groupe de produits pour chaque date d'échéance, qu'une commande soit due ou non?
Par exemple, je voudrais que W7 Y20 ressemble à ceci:
3 Réponses :
Vous devez croiser votre table activealesorder avec votre table prodgroup et une table de dates.
Vous pouvez utiliser VALUE () et faire LEFT JOIN :
SELECT COALESCE(v.nettprice, 0) AS nettprice, vv.prodgroup, COALESCE(V.numofitems, 0) AS numofitems,
vv.prodgroup, v.traderid, v.duestring
FROM ( VALUES (123, '2020-02-10'),
(456, '2020-02-10'),
(789, '2020-02-10')
) vv(prodgroup, DueDate) LEFT JOIN
[db].[dbo].[v_activesalesorder] v
ON v.prodgroup = vv.prodgroup AND v.DueDate = vv.DueDate;
Une jointure croisée génère toutes les lignes de résultat. Ensuite, rejoignez vos données existantes.
WITH orders AS ( SELECT * FROM db.dbo.v_activesalesorder WHERE prodgroup IN (123, 456, 789) AND traderid = 'CUST01' ) SELECT o.nettprice, p.prodgroup, COALESCE(o.numofitems, 0) as num_of_items, d.duedate, o.traderid o.duestring FROM (SELECT DISTINCT prodgroup FROM orders) p CROSS JOIN (SELECT DISTINCT duedate FROM orders) d LEFT JOIN orders o ON o.prodgroup = p.prodgroup AND o.duedate = d.duedate ORDER BY d.duedate, p.prodgroup;
Dans votre SELECT DISTINCT, les données doivent-elles être des commandes ?
Oui, j'ai changé le nom plus tard. Désolé, j'ai corrigé cela maintenant.
Remarque: vous pouvez supprimer tous les
[et]et probablement la plupart de vos'. Vous pouvez demander plusieurs groupes de produits avecWHERE prodgroup IN (123, 456, 789).Autre remarque:
duestringne doit pas être une colonne du tableau, car il peut être généré à partir de la colonneduedate.Merci, des modifications ont été apportées