J'ai les tables SQL Server suivantes. Dans le but de ma question, il ne peut y avoir qu'une "Personne" avec un nom donné ( Person
, ou une combinaison de Person
+ Year
est la key primaire des tables).
DailySalesSummary +------+--------+---------+------+-------------+-------------+-----------+ | Year | Person | Family | City | PersonSales | FamilySales | CitySales | +------+--------+---------+------+-------------+-------------+-----------+ | 2013 | Jim | Smith | 1 | $10 | $10 | $10 | | 2013 | Anna | Smith | 1 | $0 | $10 | $10 | | 2013 | John | Stewart | 3 | $8 | $8 | $13 | | 2013 | Todd | Johnson | 3 | $4 | $5 | $13 | | 2013 | Alan | Johnson | 3 | $1 | $5 | $13 | +------+--------+---------+------+-------------+-------------+-----------+ SalesSummary +------+--------+-------------+-----------+ | Year | Person | FamilySales | CitySales | +------+--------+-------------+-----------+ | 2013 | Jim | $55 | $55 | | 2013 | Anna | $55 | $55 | | 2013 | John | $24 | $39 | | 2013 | Todd | $10 | $39 | | 2013 | Alan | $5 | $39 | +------+--------+-------------+-----------+ Reference +--------+--------+------+ | Person | Family | City | +--------+--------+------+ | Jim | Smith | 1 | | … | … | … | +--------+--------+------+
Je veux mettre à jour la table SalesSummary
avec le contenu de la table DailySalesSummary
. Je l'ai fait de la façon suivante:
UPDATE SalesSummary SET FamilySales = SalesSummary.FamilySales + p.FamilySales FROM DailySalesSummary p, Reference bx WHERE SalesSummary.Person= bx.Person AND bx.City = p.City AND bx.Family = p.Family AND SalesSummary.Year = p.Year UPDATE SalesSummary SET CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal FROM DailySalesSummary p, Reference bx WHERE SalesSummary.Person = bx.Person AND bx.City = p.City AND SalesSummary.Year = p.Year
Je voudrais find un moyen de combiner les deux instructions de mise à jour dans une seule instruction de mise à jour qui prendra soin de tout, mais je ne peux pas déterminer la structure exacte nécessaire.
Excusez-vous si la solution nécessaire est offensivement facile, mais j'apprécie toute aide.
Vous pouvez le faire avec une seule mise à jour:
UPDATE SalesSummary SET FamilySales = SalesSummary.FamilySales + (case when bx.Family = p.Family then p.FamilySale else 0 end), CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal FROM DailySalesSummary p, Reference bx WHERE SalesSummary.Person = bx.Person AND bx.City = p.City AND SalesSummary.Year = p.Year;
Cela lui FamilySales
dans les lignes qui ne correspondent pas à la condition bx.Family = p.Family
. Mais cela devrait avoir le même effet que vos deux requêtes.
MODIFIER:
Ce qui suit semble fonctionner sur datatables que vous avez:
UPDATE ss set FamilySales = ss.FamilySales + dss.FamilySales, CitySales = ss.CitySales + dss.CitySales FROM SalesSummary ss join DailySalesSummary dss on ss.Person = dss.Person and ss.City = dss.City ss.Family = dss.Family;
Je ne comprends pas pourquoi il y a une jointure à la table bx
. Vous pouvez toujours le faire si vous voulez filterr les choses.
Pour autant que je DailySalesSummary
, datatables de DailySalesSummary
sont alignées sur ce qui doit être mis à jour, donc une simple join
réunit les bonnes lignes.
En fait, vous ne pouvez pas mettre à jour plus d'une table avec une seule instruction UPDATE
. Plus d'informations peuvent être trouvées à cette réponse Stack Overflow.
Si toutes les colonnes en cours de mise à jour se trouvent dans la même table et proviennent des mêmes tables source, vous pouvez simplement mettre à jour plusieurs colonnes en procédant comme suit:
UPDATE SalesSummary SET FamilySales = SalesSummary.FamilySales + p.FamilySales, CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal FROM DailySalesSummary p, Reference bx WHERE SalesSummary.Person= bx.Person AND bx.City = p.City AND bx.Family = p.Family AND SalesSummary.Year = p.Year
Bien que je ne reorderais pas SQL 2000
jointures de style SQL 2000
. Le retravailler ressemblerait à ceci:
UPDATE SalesSummary SET FamilySales = SalesSummary.FamilySales + p.FamilySales, CityTotal = SalesSummary.FamilyTotal + p.FamilyTotal FROM DailySalesSummary p JOIN Reference bx ON bx.City = p.City AND bx.Family = p.Family WHERE SalesSummary.Year = p.Year AND SalesSummary.Person = bx.Person
UPDATE s SET s.FamilySales = s.FamilySales + fam.FamilySales, s.CitySales = s.CitySales + city.CitySales FROM SalesSummary s JOIN Reference r ON r.Person = s.Person JOIN (SELECT DISTINCT Year, Family, FamilySales FROM DailySalesSummary) fam ON fam.Family = r.Family AND fam.Year = s.Year JOIN (SELECT DISTINCT Year, City, CitySales FROM DailySalesSummary) city ON city.City = r.City AND city.Year = s.Year
Vous pouvez voir un exemple de travail ici à SQLFiddle .