-1
votes

Y a-t-il un moyen plus élégant d'insérer plusieurs sélectionnées à partir de 1 table et d'insérer-les dans le tableau 2?

La façon dont je le fais en ce moment est la suivante: xxx

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.


10 commentaires

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 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.


3 Réponses :


2
votes

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


2 commentaires

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



1
votes

Qu'en est-il d'utiliser ou xxx


3 commentaires

Cela fonctionnera correctement si chaque Sélectionnez la déclaration n'a que des rangées qui ne sont pas présentées dans d'autres


parfois où .. ou .. 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.



1
votes

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)


3 commentaires

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 () .


@gordonlinoff je pensais quelque chose de plus permanent / extensible sans redéployer le code mais c'est un bon point