【问题标题】:Getting Sum of MasterTable's amount which joins to DetailTable获取加入 DetailTable 的 MasterTable 金额的总和
【发布时间】:2012-07-13 22:34:40
【问题描述】:

我有两张桌子:
1.大师

|身份证 |姓名 |金额 | |-----|--------|--------| | 1 |一个 | 5000 | | 2 |乙 | 10000 | | 3 | c | 5000 | | 4 | d | 8000 |

2。详情

| ID |主ID| PID |数量 | |-----|--------|--------|------| | 1 | 1 | 1 | 10 | | 2 | 1 | 2 | 20 | | 3 | 2 | 2 | 60 | | 4 | 2 | 3 | 10 | | 5 | 3 | 4 | 100 | | 6 | 4 | 1 | 20 | | 7 | 4 | 3 | 40 |

我想从 Master 中选择sum(Amount) 加入Detail 其中Detail.PID in (1,2,3)

所以我执行以下查询:

SELECT SUM(Amount) FROM Master M INNER JOIN Detail D ON M.ID = D.MasterID WHERE D.PID IN (1,2,3)

结果应该是 20000。但我得到了 40000
this fiddle。有什么建议吗?

【问题讨论】:

    标签: sql sql-server tsql join sum


    【解决方案1】:

    你得到的数量正好是双倍的,因为详细表对于 WHERE 子句中的每个 PID 都有两次出现。

    demo

    使用

    SELECT SUM(Amount) 
    FROM Master M 
    WHERE M.ID IN (
      SELECT DISTINCT MasterID
      FROM DETAIL
      WHERE PID IN (1,2,3) )
    

    【讨论】:

      【解决方案2】:

      当所有列都在主表中时,加入主表和详细信息的要求是什么。

      此外,这些表上没有定义任何 FK 关系。查看您的数据,在我看来,MasterId 的详细信息表上应该有 FK。如果是这种情况,那么您根本不需要加入表格。

      另外,如果您想确保在详细信息表中有您需要求和的记录的记录并且没有 FK 关系。然后你可以试试exists而不是join。

      【讨论】:

      • 再次查看问题。我想要(1,2,3)中详细表的pid的数量主表的总和(pid仅是详细的)。
      • 然后使用exists。 SELECT SUM(Amount) FROM Master M WHERE (SELECT 1 FROM DETAIL D WHERE PID IN (1,2,3) and d.MasterId = M.id)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2020-03-13
      • 2018-04-22
      • 2017-07-18
      • 2018-05-31
      • 1970-01-01
      相关资源
      最近更新 更多