【问题标题】:Why Is My Subtraction Result Incorrect?为什么我的减法结果不正确?
【发布时间】:2016-08-22 08:58:30
【问题描述】:
select sum(l.coins) - sum(t.coins) as total
from luxx_getaway_2016_coins l
join thrive_rewards_redeemed t
on l.consid = t.guideid
where l.consid = 24969 and t.harvestyear = 1516

大家好。我正在尝试使用上面的查询获取更新的总数。我遇到的问题是这些总和的总和远高于应有的水平。我不确定我做错了什么。我们使用 Azure SQL 数据库,我使用 RazorSQL 和 SSMS 2012 运行此查询,结果相同。任何帮助表示赞赏。请随时要求澄清。

【问题讨论】:

  • 如果只选择行而不选择总和会返回什么?例如select * from luxx_getaway_2016_coins l join thrive_rewards_redeemed t on l.consid = t.guideid where l.consid = 24969 and t.harvestyear = 1516
  • l.considt.guideid 在各自的表中是唯一的吗?如果没有,您将在加入时获得重复。
  • @APH 两个表中所有字段的列表。我现在可以明白为什么我得到了我得到的总数。对于一个表中的每个行项目,都会为正在连接的表创建一个重复的行项目。因此,如果我在一个表中有 10 行,而在另一个表中有一行,则行数最少的那个需要产生与另一个表产生的行一样多的行。
  • @rdbradshaw 我现在意识到了这一点。感谢您指出这一点。
  • @rdbradshaw 在这些条件下在 sql server 中这是不可能的吗?

标签: sql-server tsql ssms azure-sql-database


【解决方案1】:

复制问题的简单解决方案:

Select
    (select sum(l.coins)
    from luxx_getaway_2016_coins l
    where l.consid = 24969)

-
    (select sum(t.coins)
    from thrive_rewards_redeemed t
    where t.guideid = 24969 
        and t.harvestyear = 1516)

对于更一般的情况:

; With A as (select consid, sum(l.coins) as TotA
    from luxx_getaway_2016_coins l
    group by consid)
, B as (select guideid, sum(t.coins) as TotB
    from thrive_rewards_redeemed t
    where t.harvestyear = 1516
    group by guideID)

Select a.consid, TotA - TotB as Total 
from A
inner join B
on a.Consid = b.GuideID

【讨论】:

  • 这适用于这个查询。谢谢你。我的下一步是弄清楚如何应用这个原则,并为所有 consid 制作一个带有硬币的视图。
  • @acecabana - 我已经编辑了答案,以展示在一般情况下执行此操作的一种方法。我现在不在我的主计算机上,所以没有测试它。
  • 有什么方法可以应用完全连接并且不让它为不匹配的行显示空值?我想对两个表中都存在的 id 进行减法运算,但保留表 a 中的所有记录以及减法运算的更新总数。
  • 是的;如果将inner join 更改为outer join,查询的工作方式应该或多或少相同。只需根据需要添加一些ISNULLs。
猜你喜欢
  • 1970-01-01
  • 2016-05-02
  • 1970-01-01
  • 2022-12-05
  • 2016-11-04
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多