2010-02-06 8 views
5

Könnte jemand überprüfen meine SQL-Anweisung für die ordnungsgemäße Funktionsweise und allgemeinen gesunden Menschenverstand Ansatz?SQL Server-- Join Tabellen und SUM-Spalten für jede einzelne Zeile

Hier ist, was passiert: Ich habe eine Eltern-Kind-Tabelle mit einer Eins-zu-viele-Beziehung, verbunden mit einer Spalte namens AccountNumberKey. Die untergeordnete Tabelle enthält numerische Spalten, die ich zusammenfassen muss.

Die Daten sind so, dass alle untergeordneten Datensätze mit einem angegebenen AccountNumberKey-Wert immer die gleichen Werte in ihren zwei numerischen Spalten haben. Ich möchte diese Tabellen verbinden und für jeder AccountNumberKey die Summe dieser beiden Spalten in eine temporäre Tabelle setzen. Ich muss nur die Spalten aus einem einzelnen Kind Datensatz für jeden AccountNumberKey summieren.

Einige Beispieldaten unter Willen (hoffe ich) machen dies deutlicher:

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 

Hier ist meine SQL-Anweisung:

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 

Das Ziel ist es, die Tabellen zu verknüpfen und die Daten in eine temporäre Tabelle setzen so sieht es so aus:

TempTable columns 


InstitutionID  AccountNumberKey  Total 
LocalHost   1873283    1100 

Erfüllt meine SQL-Abfrage muster? Ich bin kein Genie, wenn es um Gruppierungen geht und fragte mich, ob dies A) korrekt und B) ein guter Weg ist oder ob es bessere Verbindungen gibt, um es zu versuchen.

Danke!

Antwort

4

Diese Abfrage wird die Ergebnisse, die Sie scheinen zu wollen:

SELECT 
    P.InstitutionID, 
    P.AccountNumberKey, 
    Total = C.Value1 + C.Value2 
FROM 
    Parent P 
    INNER JOIN (
     SELECT DISTINCT AccountNumberKey, Value1, Value2 
     FROM Child 
    ) C ON P.AccountNumberKey = C.AccountNumberKey 

Aber ich möchte wiederholen, was andere gesagt haben: Wenn Sie etwas über das Design tun, sollten Sie, weil es nicht normalisiert wird. Value1 und Value2 aus Ihrer Child-Tabelle gehören wirklich in die Parent-Tabelle, da sie sich auf das Parent beziehen. Was ist, wenn zwei Zeilen in der Child-Tabelle für denselben AccountNumberKey unterschiedliche Werte haben? Ihre Daten wären alle falsch und wer weiß, welche möglichen katastrophalen Folgen für das Geschäft haben könnten? Die obige DISTINCT würde in diesem Fall fehlschlagen und zwei Zeilen für die übergeordnete Zeile zurückgeben.

UPDATE:

larryq sagte:

Was Wert1 und Wert2 vielleicht zu der übergeordneten Tabelle zu gehören brauchen, ist es möglich, auf der Straße werden sie für jeden ProposalNumber/AccountNumberKey unterschiedlich sein Kombination.

In diesem Fall würde die Abfrage, die ich Ihnen gegeben habe, seltsame Ergebnisse ergeben. Wie werden Sie entscheiden, welche Werte für eine AccountNumber verwendet werden sollen? Willst du immer die neueste Vorschlagsnummer? Möchten Sie eine Zeile für jede einzelne Gruppe von Value1 und Value2 sehen? Gibt es eine weitere Tabelle, um die aktuelle Vorschlagsnummer zu finden?

1

Erstens, wenn That "untergeordnete Datensätze mit einem bestimmten AccountNumberKey-Wert immer dieselben Werte in ihren zwei numerischen Spalten haben", dann ist Ihr Tabellenschema nicht in der richtigen dritten Normalform (3NF). Es sollte mit AccountNumberKey als Schlüssel pro AccountNumberKey, eine andere Tabelle mit einer Zeile sein und Value1 und Value2 als Datenfelder und Ihre Fragen zu dieser Tabelle beitreten sollte (mit AccountNumberKey), Value1 und Value2 abzurufen.

Zweitens in dieser Situation sollten Sie nicht ein Kind Tisch zu einer übergeordneten Tabelle auf einer übergeordneten Tabelle Join-Spalte, die kein Key ist. Dies führt zu einem kartesischen Produkt (wobei die Ausgabe mehrere Zeilen für jede Zeile auf beiden Seiten des Joins enthält, wobei diese Datensätze doppelt oder dreifach gezählt werden). Ist AccountNumberKey ein Schlüssel für die Elterntabelle?

Ist dies nicht der Fall, dann ist die einzige Spalte in der übergeordneten Tabelle, die als FK in der untergeordneten Tabelle verwendet werden soll, die Schlüsselspalte ParentID.

Wenn es ist (wenn AccountNumberKey in Parent Tabelle eindeutig ist), dann ist die Wert1 und Wert2 Spalten shhould in der übergeordneten Tabelle, nicht in der untergeordneten Tabelle.

+0

Charles, Sie können an jeder beliebigen Spalte teilnehmen, unabhängig vom Schlüsselstatus. Obwohl du vielleicht gesagt hast, dass es nicht ratsam ist? Der Server ermöglicht es Ihnen, sich an allem, was Ihnen gefällt, anzuschließen. – ErikE

+0

@Emtucifor, Ja, du hast Recht Ich werde bearbeiten, um diesen Punkt klar zu machen .. Beitritt zu anderen als PKs ergibt kartesische Produkte ... aber manchmal (nicht hier) das ist, was Sie wollen ... –

+0

@Charles, können Sie verbinden Sie einen beliebigen Tisch mit einem beliebigen Tisch, ganz wie Sie möchten und in der Regel gehe ich nicht ohne Grund an 2NF vorbei, es lohnt sich selten. –

1

Ihre beitreten werden nicht jene Ergebnisse erzielen, da AccountNumberKey nicht einzigartig ist die

LocalHost   1873283    1100 

4 Mal mal, eine für jedes Kind Datensatz erzeugen würde kommen, wenn aggregiert, die 4400 als Wert ergeben würde.

+0

Eigentlich stimmt das nicht, da er nach Child.ProposalNumber gruppiert ist. Aber er wird keine Zeile für jede Zeile in der übergeordneten Tabelle erhalten. – ErikE

Verwandte Themen