Je dois créer une commission de vente & rapportRapport de synthèse regroupé à la date de plusieurs plages
Fondamentalement, il va (s'il vous plaît pardonnez la folie blatent de la table SaleDate, mais je simplifie la logique métier, et en réalité est logique de l'avoir de cette façon)
SELECT agentName,
SUM(sales.Amount) AS Gross,
SUM(sales.Amount * sales.Commission) AS Commission
FROM agent
INNER JOIN sales ON agent.agentId = sales.agentId
WHERE sales.saleId IN (SELECT saleId FROM saleDate WHERE saleDate.myDate BETWEEN @minDate AND @maxDate)
GROUP BY agentName
Cette requête fonctionne donc très bien. Le problème se produit lorsque j'ai besoin d'ajouter une deuxième plage de dates.
IE, où ils veulent comparer les ventes de 2007 & Les ventes de 2008 côte à côte.
Je actuellement ont essentiellement la même requête, mais j'ai ajouté des alias à la table de vente et a ajouté un autre
SELECT agentName,
SUM(sales1.Amount) AS Gross1,
SUM(sales1.Amount * sales1.Commission) AS Commission1,
SUM(sales2.Amount) AS Gross2,
SUM(sales2.Amount * sales2.Commission) AS Commission2,
SUM(sales3.Amount) AS Gross3,
SUM(sales3.Amount * sales3.Commission) AS Commission3
FROM agent
INNER JOIN sales1 ON agent.agentId = sales1.agentId
INNER JOIN sales2 ON agent.agentId = sales2.agentId
INNER JOIN sales3 ON agent.agentId = sales3.agentId
WHERE sales1.saleId IN (SELECT saleId FROM saleDate WHERE saleDate.myDate BETWEEN @minDate1 AND @maxDate1) OR
sales2.saleId IN (SELECT saleId FROM saleDate WHERE saleDate.myDate BETWEEN @minDate2 AND @maxDate2) OR
sales3.saleId IN (SELECT saleId FROM saleDate WHERE saleDate.myDate BETWEEN @minDate3 AND @maxDate3)
GROUP BY agentName
Cette requête prend toujours cependant (plus de 20 minutes avant que j'annulé il), la l'original a pris moins d'une seconde et si je n'utilise que deux groupes cela prend 9 secondes.
Des idées sur la façon d'améliorer cette performance?
Je suis prêt à changer la conception de cette requête.
Je fini par utiliser une UNION (prend moins d'une seconde maintenant), je l'ai fait un SELECT AgentName bruts1, Commission1, NULL, NULL, NULL, NULL FROM. UNION SELECT nomOrgent, NULL, NULL, Gross2, Commission2, NULL, NULL DE ... puis fait un choix parmi ceux-ci et groupés et additionnés –