La façon dont je le fais en ce moment est la suivante: avec chaque requête de sélection Sélection de données groupées légèrement différentes.
La table finale disposera donc de tous les volumes de vente par produit. Ensuite, les volumes regroupés par l'État et enfin des volumes de vente groupés par pays. P> p>
3 Réponses :
Union TOUT:
DROP TABLE IF EXISTS dbo.TempVolumePrediction SELECT YearNb, WeekNb, ProdID, SumOfVolume, Country, VolumeTypeCode INTO dbo.TempVolumePrediction FROM ( SELECT YearNb, WeekNb, ProdID, Sum(Volume) AS SumOfVolume, Country, 'Stock' AS VolumeTypeCode WHERE Country Not Like 'EE' GROUP BY YearNb, WeekNb, ProdID, Country UNION ALL SELECT YearNb, WeekNb, ProdID, Sum(Volume) AS SumOfVolume, 'BUEU' AS Country, 'Stock' AS VolumeTypeCode WHERE StockVolumes.Country Not Like 'EE' GROUP BY YearNb, WeekNb, ProdID UNION ALL SELECT YearNb, WeekNb, ProdID, Sum(Volume) AS SumOfVolume, 'DTEU' AS Country, 'Stock' AS VolumeTypeCode FROM .StockVolumes WHERE StockVolumes.Country Not Like 'EE' AND GroupCode = 'DT' GROUP BY YearNb, WeekNb, ProdID UNION ALL SELECT YearNb, WeekNb, ProdID, Sum(Volume) AS SumOfVolume, 'OREU' AS Country, 'Stock' AS VolumeTypeCode FROM .StockVolumes WHERE StockVolumes.Country Not Like 'EE' AND GroupCode = 'OR' GROUP BY YearNb, WeekNb, ProdID ) d
Cela semble beaucoup plus économique, je vais essayer cela merci!
@Tim, a ajouté une mise à jour de la meilleure performance pour votre décharge temporaire
Qu'en est-il d'utiliser ou strong>
Cela fonctionnera correctement si chaque Sélectionnez la déclaration code> n'a que des rangées qui ne sont pas présentées dans d'autres
parfois où .. ou .. code> peut causer des performances pales que isolé et bien indexé par l'Union tout
@Alexandervolok, je suis d'accord, la question a été modifiée tant de fois, de sorte que la réponse initiale donnée par moi n'a pas beaucoup de sens maintenant.
Certaines simplifications peuvent être possibles si vous êtes prêt à ajouter une table qui mappe CockCode et pays
CREATE TABLE GroupCodeCountry( GroupCode VARCHAR(2), Country VARCHAR(4) );
INSERT INTO GroupCodeCountry('BU', 'BUEU'); --assumed from pattern - did your query set have a typo?
INSERT INTO GroupCodeCountry('DT', 'DTEU');
INSERT INTO GroupCodeCountry('OR', 'OREU');
--this query now handles the cases where the groupcode causes an override to the country INSERT INTO TempVolumePrediction
SELECT s.YearNb, s.WeekNb, s.ProdID, Sum(s.Volume), COALESCE(g.Country, s.Country), 'Stock'
FROM StockCountry s LEFT OUTER JOIN GroupCodeCountry g on s.GroupCode = g.GroupCode
WHERE s.Country Not Like 'EE'
GROUP BY s.YearNb, s.WeekNb, s.ProdID, COALESCE(g.Country, s.Country)
Cela a l'air très intéressant, j'ai déjà déjà une table de référence qui a cartographié de groupe et de pays, de sorte que je puissiez implémenter cela. Je ferai des tests et revenir si j'ai des questions. Merci!
@Caiusjard. . . Vous n'avez pas besoin d'une table séparée. Vous pouvez simplement utiliser une déclaration valeurs () code>.
@gordonlinoff je pensais quelque chose de plus permanent / extensible sans redéployer le code mais c'est un bon point
Vous devez vraiment mettre les requêtes réelles que vous utilisez. Vous avez trop simplifié et perdu des détails, nous devons donner une bonne réponse à la question
Ça dépend. Est une seule transaction nécessaire? Combien de données est-ce?
@Caiusjard Merci pour la contribution dont vous avez probablement raison, j'ai essayé d'ajouter un peu plus de détails.
@jarlh non ce n'est pas nécessaire, mon objectif principal est la performance. Rougly 700k rangées de données.
Plusieurs transactions plus petites peuvent obtenir des performances. C'est à dire. Gardez la solution actuelle avec plusieurs opérations d'insertion dans des transactions distinctes. (Ou encore plus petits.)
@jarlh, IMHO,
Sélectionnez dans CODE> est quelque chose à gagner la meilleure vitesse d'insertion. De toute façon OP jette la sortie dans une table temporaire (pas un #temporaire)@Alexandervolok, Point pris!
Vos deux premières questions semblent manquantes de. Vos deux dernières requêtes préfixent le nom de la table avec une période; Je n'ai pas vu cela avant - est-ce une faute de frappe?
@Caiusjard simplement une erreur de copie et de coller sur ma part
@Tim, j'espère que votre question a été répondue. Si oui, pouvez-vous envisager de le marquer en tant que tel.