1
votes

Existe-t-il un moyen pour moi de créer des lignes pour les commandes qui ne se sont pas produites avec SQL?

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

Commandes par semaine

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:

 Commandes et aucune commande d'ici la semaine prévue


3 commentaires

Remarque: vous pouvez supprimer tous les [ et ] et probablement la plupart de vos '. Vous pouvez demander plusieurs groupes de produits avec WHERE prodgroup IN (123, 456, 789) .


Autre remarque: duestring ne doit pas être une colonne du tableau, car il peut être généré à partir de la colonne duedate .


Merci, des modifications ont été apportées


3 Réponses :


0
votes

Vous devez croiser votre table activealesorder avec votre table prodgroup et une table de dates.


0 commentaires

0
votes

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;


0 commentaires

1
votes

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;


2 commentaires

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.