【问题标题】:Sum returns the correct answer... Sometimes总和返回正确答案......有时
【发布时间】:2020-09-29 21:39:39
【问题描述】:

我有下面的 SQL,它返回正确的答案,直到第二个表匹配。在任何回报中应该只有一个“1”,但我在不同的地方得到了 2 和 3。我在表格中有 3 个不同的日期,有时当它在 PA Sim Cnt 中遇到某些东西时会影响 2 Mtr Cnt 中的返回。

SELECT [Membership tbl].[Call Sign], Sum(IIf([2 Meter Net tbl].[Cur Date]=#9/15/2020#,1,0)) AS [2 Mtr Cnt], Sum(IIf([PA Simplex tbl].[Cur Date]=#9/15/2020#,1,0)) AS [PA Sim Cnt]
FROM ([Membership tbl] LEFT JOIN [2 Meter Net tbl] ON [Membership tbl].[Call Sign] = [2 Meter Net tbl].[Call Sign]) LEFT JOIN [PA Simplex tbl] ON [Membership tbl].[Call Sign] = [PA Simplex tbl].[Call Sign]
GROUP BY [Membership tbl].[Call Sign]
ORDER BY [Membership tbl].[Call Sign];

我已经为此工作了几天,并尝试了我能想到的所有组合。

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • 这似乎是一个常见的错误,人们想要一些连接,每个可能涉及不同的键,一些子查询,每个可能涉及连接和/或聚合,但他们错误地尝试完成所有连接然后全部聚合或聚合以前的聚合。在适当的行上编写单独的聚合和/或聚合一个案例语句选择行;加入一个独特的列集。有时 DISTINCT 聚合在非键连接后选择正确的值。 (对 2 个输入表中任一个的非键的连接可以为每个表的每个键提供多行。)

标签: sql datetime ms-access sum left-join


【解决方案1】:
SELECT m.[Call Sign], Nz(mn.[2 Mtr Cnt],0) AS [2 Mtr Cnt], Nz(ps.[PA Sim Cnt],0) AS [PA Sim Cnt]

FROM ([Membership tbl] AS m 
LEFT JOIN (SELECT [Call Sign], 
    Sum(IIf([2 Meter Net tbl].[Cur Date]=#9/15/2020#,1,0)) AS [2 Mtr Cnt] 
FROM [2 Meter Net tbl] 
GROUP BY [Call Sign])  AS mn ON m.[Call Sign] = mn.[Call Sign]) 

LEFT JOIN (SELECT [Call Sign], 
    Sum(IIf([PA Simplex tbl].[Cur Date]=#9/15/2020#,1,0)) AS [PA Sim Cnt] 
FROM [PA Simplex tbl] 
GROUP BY [Call Sign])  AS ps ON m.[Call Sign] = ps.[Call Sign]

ORDER BY m.[Call Sign];

【讨论】:

  • 纯代码的答案通常很差。解释它为什么回答问题和/或解决或纠正问题。 How to Answer
【解决方案2】:

我怀疑你在加入之前需要在子查询中预先聚合,所以每个日期只计算一次:

SELECT m.[Call Sign], mn.[2 Mtr Cnt], ps.[PA Sim Cnt]
FROM (
    [Membership tbl] m
    LEFT JOIN (
        SELECT [Call Sign], Sum(IIf([Cur Date]=#9/15/2020#,1,0)) AS [2 Mtr Cnt]
        FROM [2 Meter Net tbl] 
        GROUP BY [Call Sign]
    ) mn ON m.[Call Sign] = mn.[Call Sign]
) LEFT JOIN (
    SELECT [Call Sign], Sum(IIf([Cur Date]=#9/15/2020#,1,0)) AS [PA Sim Cnt]
    FROM [PA Simplex tbl] 
    GROUP BY [Call Sign]
) ps ON m.[Call Sign] = ps.[Call Sign]
ORDER BY m.[Call Sign];

【讨论】:

  • 当我在上面输入时它说。
  • 您的查询不包含作为聚合函数一部分的指定表达式“呼号”。
  • @Rang624:我的错,我忘记了第一个子查询中的GROUP BY 子句。固定。
  • 我真的很感谢你的帮助,这太接近了,我可以品尝到它。首先它向我查询日期参数,其次它找到它放入 0 的日期的所有位置,我期待总和。我后来想在日期之间输入,如果没有找到呼号(它放在空白处),我期待 0。
  • @Rang624:使用Nz()null 值转换为0,例如:SELECT m.[Call Sign], Nz(mn.[2 Mtr Cnt], 0) as [2 Mtr Cnt], Nz(ps.[PA Sim Cnt], 0) as [PA Sim Cnt] FROM ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多