J'ai les tables suivantes et je voudrais calculer le chiffre de vente. J'ai utilisé une certaine sous-requête pour le faire. Puis-je n'utiliser pas de sous-requête et n'utilisez pas la variable de table pour le faire?
subquery 1 will return
UK, 6924
USA, 6680
China, 100
subquery 2 will return
UK, 315
USA, 77
final result
UK, 6924, 315
USA, 6680, 77,
China, 100, null
3 Réponses :
Vous pouvez faire quelque chose comme suit pour rejoindre les résultats de la requête individuelle en un comme suit
select aa.country, aa.popu, bb.amou,cc.smou from
(select sum(population) as popu, country from population group by country) aa
inner join
(select sum(amount) as amou, country from sales_amount group by countr) bb
on aa.country = bb.country inner join
(select sum(sales) as smou, country from sales_amount group by countr) cc
on bb.country = cc.country
-- inner join .. so on as you wrote....
C'est la même chose que la requête originale, juste un ordre alternatif de jointures, aucun être humain n'utilisera jamais :-)
D'accord, je ne vois aucune autre option pour lire les résultats lorsque l'on veut combiner des résultats de différentes tables en un seul résultat de la requête! Autre que, écrire un CTE ou créer une vue ou quelque chose comme ci-dessus ..
Edit, OK, bien alors pourquoi ne pas créer de vues où l'agrégation est déjà effectuée, surtout si cela est des informations que vous allez souvent utiliser. Si la lisibilité est votre principale préoccupation, cela devrait aider. E.G.:
SELECT vw_aggregated_population.country, popu, amou, FROM vw_aggregated_population LEFT JOIN vw_aggregated_sales_amount ON vw_aggregated_population.country=vw_aggregated_sales_amount.country GROUP BY vw_aggregated_population.country
Sollés par P>
CREATE VIEW vw_aggregated_population AS SELECT sum(population) AS popu, country FROM population GROUP BY country CREATE VIEW vw_aggregated_sales_amount AS SELECT sum(amount) AS amou, country FROM sales_amount GROUP BY country
Parce que ces jointures seraient beaucoup à plusieurs et que les sommes seraient mauvaises. Les performances supplémentaires seraient horribles en raison du nombre d'explosions de lignes.
Ok, vous devriez peut-être indiquer cela dans votre question. Voir la réponse mise à jour
Ceci est évident, pourquoi devriez-vous regrouper par une colonne déjà unique?
Vous seriez surpris de savoir combien de ces types de choses que j'ai vues dans les questions de si ...
Vous pouvez utiliser Il doit être clair comment développer cela pour plus de tables. P> P> Inscrivez-vous complète code> ou Groupe par code> avec Union tout code> pour obtenir tous les lignes em> dans toutes les tables. Voici un exemple utilisant la deuxième approche:
Étant donné que de nombreuses tables sont impliquées et que nous ne sommes pas au courant de la taille des données. Donc, du point de vue de la performance, lequel préféreriez-vous? Rejoindre complet ou union tout avec le groupe par.
@Ankitbajpai. . . Je mets l'approche code> Union tout code> car elle généralise plus facilement. Je ne suis pas vraiment sûr qui fonctionnerait mieux dans SQL Server. Si vous avez une grande quantité de données, cela vaut la peine de comparer les performances. Joindre complet CODE> a quelques frais généraux supplémentaires comparés à celui d'un autre rejoindre code> s. groupe par code> a également des frais généraux. Mais si vous avez des index sur pays code> dans chacun des sous-titres, le groupe par code> devrait être très raisonnable.
Les échantillons de données et les résultats attendus nous aideront à vous aider.
Semble une approche raisonnable. Pourquoi voulez-vous le changer?
Probablement, cependant, vous aurez besoin d'au moins une sous-requête.
Pourquoi ne faites-vous pas juste que vous rejoignez toutes les tables et appelez-en une groupeby à la fin plutôt que pour toujours faire un groupe de groupe dans une sous-requête? L'optimiseur de requêtes doit être suffisamment intelligente pour déterminer comment faire cela efficacement
@Karl: Parce que ces jointures seraient nombreuses à plusieurs et que les sommes seraient mauvaises