SQL Server--为每个不同的行连接表和SUM列

时间:2010-02-06 00:56:57

标签: sql-server join sum aggregate-functions

有人可以仔细检查我的SQL语句是否有正确的操作和一般的常识方法?

这是发生了什么:我有一个父对子表和一对多关系,加入了一个名为AccountNumberKey的列。子表中包含数字列,我需要总结一下。

数据是指具有给定AccountNumberKey值的所有子记录在其两个数字列中始终具有相同的值。我想加入这些表格 每个AccountNumberKey将这两列的总和放入临时表中。我只需要给出每个AccountNumberKey的单个子记录中的列。

下面的一些示例数据将(我希望)更清楚:

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

这是我的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

目标是链接表并将数据放入临时表中,如下所示:

TempTable columns


InstitutionID       AccountNumberKey        Total
LocalHost           1873283             1100

我的SQL查询是否通过了集合?在分组时我不是天才,并且想知道这是否是A)正确和B)一个好的方法去或者是否有更好的连接尝试。

谢谢!

3 个答案:

答案 0 :(得分:3)

此查询将提供您似乎想要的结果:

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

但我想回应其他人所说的话:如果你能对设计做任何事情,你应该,因为它没有正常化。您的Child表中的Value1和Value2确实属于Parent表,因为它们与Parent有关。如果Child表中的两行对同一AccountNumberKey具有不同的值集,该怎么办?您的数据将全部错误,谁知道可能对业务产生什么样的灾难性后果?上面的DISTINCT在这种情况下会失败,并为Parent行返回两行。

<强>更新

拉里克说:

  

至于value1和value2可能需要属于父表,那么对于每个ProposalNumber / AccountNumberKey组合,它们可能会有所不同。

在这种情况下,我给你的查询会得到奇怪的结果。您将如何确定AccountNumber使用哪组值?你会一直想要最新的ProposalNumber吗?您是否希望为每个不同的Value1和Value2集合查看一行?是否有另一个表要加入以找到要使用的当前ProposalNumber?

答案 1 :(得分:1)

首先,如果它是真的thjat“具有给定AccountNumberKey值的子记录将在它们的两个数字列中始终具有相同的值”,那么您的表模式不是正确的第三范式(3NF)。应该有另一个表格,每个AccountNumberKey有一行,AccountNumberKey为关键,Value1Value2为数据字段,您的查询应该加入此表格(使用AccountNumberKey)来检索Value1Value2

其次,在这种情况下,您不应将子表连接到父表列上的父表,该列是 而不是键 。这将导致笛卡尔积(其中输出将包括连接两侧的每一行的多行,实现对这些记录进行双倍或三倍计数...)AccountNumberKey是父表的键吗?

如果不是,那么父表中唯一应该用作子表中FK的列是键列ParentID

如果 (如果AccountNumberKey在父表中是唯一的),那么Value1和Value2列应该在父表中,而不是在父表中儿童表。

答案 2 :(得分:1)

您的加入不会产生这些结果,因为AccountNumberKey不是连接将产生的唯一

LocalHost           1873283             1100

4次,每个子记录一次,汇总后将产生4400作为值。