【问题标题】:SQL Sum() with correlated subquery具有相关子查询的 SQL Sum()
【发布时间】:2011-09-08 19:27:46
【问题描述】:

我有两个表:fund 和 items。 Items 有一个名为fundID 的字段,它与fund 表的ID 相关。商品也有价格字段。

这是两个表的简化示例:

FUND
ID    fundName
1     maintenance
2     books
3     development
4     media


ITEMS
ID    price    fundID
1     $10        2
2     $20        4
3     $5         4
4     $8         1
5     $10        3
6     $12        4

我想创建一个查询,该查询将为我提供每个基金的名称以及通过 fundID 字段连接到该基金的项目的所有价格总和。我尝试了几种方法,例如在 SUM() 和 WHERE 中使用相关子查询,但我遇到了错误。

如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

  • sql 服务器?我的sql?甲骨文?版本 ?它总是有帮助:-)
  • 实际上是带有 Access 前端的 SharePoint 2010 列表。实际的 SQL 服务器是 MS SQL(不确定是哪个版本)。

标签: sql correlated-subquery


【解决方案1】:

试试这个:

SELECT f.fundname,
       SUM(i.price)
FROM   fund f
       JOIN items i
         ON i.fundid = f.id
GROUP  BY f.fundname  

【讨论】:

  • 为什么当我在代码的 SELECT 部分输入更多字段时它停止工作?例如,f.fundCode 和 fund.fundCode 都抛出不同的错误信息。
  • @penco 你不能添加导致组不明确的字段...如果你解释你的表结构(fundCode?)那么我可以指导你正确的方向。
【解决方案2】:

鉴于您的表结构,没有充分的理由这样做,但是问题确实询问了子查询并且表结构得到了简化。

所以这将给出与直接 JOIN/GROUP BY 相同的结果

SELECT f.fundname, 
       coalesce(i.price,0) price
FROM   fund f 
       LEFT JOIN (SELECT fundid, 
                          SUM(price) price 
                   FROM   items i 
                   GROUP  BY fundid) i 
         ON f.fundid = i.fundid 

请注意 COALESCE/LEFT JOIN 存在,以防您希望 0 用于没有项目的资金。

【讨论】:

    【解决方案3】:

    试试这个

    select fundName,sum(price) as  TotPrice
    from Funds f
    join Items g on g.id=f.id
    group by f.fundName
    

    【讨论】:

      【解决方案4】:
      SELECT f.fundid, f.fundName, SUM(price)
      FROM Fund f 
         INNER JOIN ITEMS i ON i.fundId = f.fundId
      GROUP BY f.FUNDID
      

      如果您有很多资金,基金 ID 可能会更好地分组

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        • 2013-03-08
        • 2013-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多