SQL Server— les tables de jointure et la SOMME des colonnes pour chaque ligne distinct
Quelqu'un pourrait-il le double de vérifier mon instruction SQL pour le bon fonctionnement et le général approche sensée?
Voici ce qu'il se passe: j'ai un parent et de l'enfant tableau avec un un-à-plusieurs relations, rejoint sur une colonne nommée AccountNumberKey. La table enfant a les colonnes numériques de cela j'ai besoin de résumer.
Les données sont telles que tous les enregistrements enfants avec un AccountNumberKey valeur aura toujours les mêmes valeurs dans les deux colonnes numériques. Je veux me joindre à ces tables et pour
chaque AccountNumberKey mettre la somme de ces deux colonnes dans une table temporaire. J'ai seulement besoin de faire la somme des colonnes à partir d'un seul enregistrement enfant donné à chacun AccountNumberKey.
Quelques exemples de données ci-dessous seront (je l'espère) de rendre cela plus clair:
Parent Table Columns
ParentID InstitutionID AccountNumberKey
1 LocalHost 1873283
2 Acme Brokers 3627389
3 Dewey, Cheatem 1392876
4 NCC1701 8837273
5 Peyton Place 9981273
Child Table Columns
ChildID AccountNumberKey Value1 Value2 ProposalNumber
1 1873283 1000 100 58
2 1873283 1000 100 59
3 1873283 1000 100 60
4 1873283 1000 100 61
Voici mon Instruction SQL:
SELECT DISTINCT Parent.InstitutionID, AccountNumberKey, SUM(Child.Value1 + Child.Value2) as total
INTO #TempTable
FROM Parent
INNER JOIN
Child ON Parent.AccountNumberKey = Child.AccountNumberKey
GROUP BY Parent.InstitutionID, Parent.AccountNumberKey, Child.ProposalNumber
L'objectif est de lier les tables et insérer des données dans une table temporaire, de sorte qu'il ressemble à ceci:
TempTable columns
InstitutionID AccountNumberKey Total
LocalHost 1873283 1100
Ma requête SQL passer de rassemblement? Je suis pas un génie quand il s'agit de groupements et se demande si cela en est Un), et B) un ok de chemin à faire ou si il y a mieux se joint à l'essayer.
Merci!
OriginalL'auteur larryq | 2010-02-06
Vous devez vous connecter pour publier un commentaire.
Cette requête donnera les résultats que vous semblez vouloir:
Mais je veux faire écho à ce que d'autres ont dit: si vous pouvez faire quelque chose au sujet de la conception, vous devriez, car il n'est pas normalisée. Valeur1 et Valeur2 à partir de votre tableau Enfant vraiment leur place dans la table Parent, comme ils sont sur le Parent. Que faire si deux lignes dans la table Enfant ont un ensemble différent de Valeurs pour la même AccountNumberKey? Vos données seront tous tort et qui sait quel genre de peut-être conséquences désastreuses que pourrait avoir pour l'entreprise? L'DISTINCTES ci-dessus échouent dans ce cas et revenir deux lignes pour la ligne Parent.
Mise à JOUR:
larryq dit:
Dans ce cas, la requête que je vous ai donné vous donner des résultats étranges. Comment allez-vous décider quel ensemble de valeurs à utiliser pour un AccountNumber? Vous voulez toujours la plus récente ProposalNumber? Aurez-vous envie de voir une ligne pour chaque groupe distinct de Valeur1 et Valeur2? Est-il une autre table de jointure pour trouver le courant ProposalNumber à utiliser?
OriginalL'auteur ErikE
Votre volonté de ne pas céder à ces résultats, depuis AccountNumberKey n'est pas unique à la jointure serait de produire des
4 fois fois, une pour chaque enregistrement enfant, une fois agrégées qui donneraient des 4400 en tant que valeur.
OriginalL'auteur Paul Creasey
Tout d'abord, s'il est vrai thjat "enfant des enregistrements avec un AccountNumberKey valeur aura toujours les mêmes valeurs dans les deux colonnes numériques", puis votre schéma de table n'est pas en bonne troisième forme normale, (3FN). Il devrait y avoir un autre tableau avec une ligne par
AccountNumberKey
, avecAccountNumberKey
comme clé, etValue1
etValue2
comme champs de données, et vos requêtes doivent être joints à ce tableau (à l'aide deAccountNumberKey
), pour récupérerValue1
etValue2
.D'autre part, dans cette situation, vous ne devez pas vous joindre à une table d'enfant pour un parent de table sur une table parent colonne qui est n'est pas une Clé. Cela va causer un produit cartésien (où la sortie comprendra plusieurs lignes pour chaque ligne dans les deux côtés de la rejoindre, en effet le double ou le triple de comptage de ces enregistrements...) Est
AccountNumberKey
une clé pour la table Parent?Si ce n'est pas le cas, alors la seule colonne dans la table parent qui doit être utilisé comme un FK dans la table enfant est la clé de la colonne
ParentID
.Si il est (si
AccountNumberKey
est unique dans la Table Parent), puis la Valeur1 et Valeur2 colonnes shhould être dans la Table Parent, pas dans la table enfant.Oui, vous avez raison, je vais modifier pour faire de ce point clair.. le rejoindre sur d'autres que PKs résultats dans les produits cartésiens... mais parfois (pas ici) c'est ce que vous voulez...
vous pouvez vous joindre à une table pour une table en aucune façon que vous aimez et en général je ne suis pas d'aller au-delà de 2FN sans bonne raison, c'est rarement la peine.
le rejoindre sur autre chose qu'un PK n'a pas le rendement d'un produit cartésien. Adhésion sans condition à des rendements d'un produit cartésien, peu importe si la colonne est une clé primaire ou pas.
Creasey: que vous "rarement" aller au-delà de 2FN signifie j'espère que je n'ai jamais travailler avec vous de manière professionnelle.
OriginalL'auteur Charles Bretana