【问题标题】:Need a Sum Query to Include Zero Totals需要总和查询以包括零总计
【发布时间】:2021-11-19 22:35:01
【问题描述】:

我正在使用 Microsoft Access 和一个简单的数据库,该数据库汇总了可计费客户的员工小时数。我创建了一个查询来计算每位员工的计费小时总数。我还需要它以零和返回工人。我无法弄清楚如何在同一个查询中正确执行此操作。

我是一名会计师,大概六年没有写过 SQL,也从来没有特别精通过。我认为对于更有经验的人来说,这应该是一个相当容易的解决方法。我的 SQL 代码正是我在设计视图中构建查询时由 Access 生成的。代码是:

SELECT [EYH Export].Worker, Sum([EYH Export].Hours) AS [Billed Hours]
FROM [EYH Export] INNER JOIN [Job List] ON [EYH Export].Client = [Job List].Client
WHERE ((([Job List].Billed)="Billed"))
GROUP BY [EYH Export].Worker;

它返回一个工人列表,第一列显示他们的姓名,第二列显示计费小时总数。为了包含没有计费时间的名称,我相信我应该使用类似:COUNT ([EYH Export].Worker WHERE ([EYH Export].Client) IS NULL;

我真的非常感谢任何建议。仅仅为我指明正确的方向将是一个巨大的祝福。

谢谢。

【问题讨论】:

  • 数据库中两行的样本会有所帮助。 1 个带有“非零和”的工人,一个带有。
  • 可能只需将您的内连接更改为 LEFT JOIN,但我们需要您的表结构、数据示例和所需结果。
  • EYH Export 中的每个 客户端在Job List 中是否有对应的行?
  • @Brad - 当然不会“只是”是LEFT JOIN,OP 的查询使用右侧表仅过滤到计费客户;在不排除没有匹配计费记录的情况下进行过滤需要一些额外的步骤。
  • EYH Export 中的每个客户在 Job List 中都有对应的行。

标签: sql ms-access count


【解决方案1】:

由于您仅将Job List 用作过滤器(WHERE ((([Job List].Billed)="Billed"))),而在SELECT不是 ,这可能对你有用...

(将过滤器从 WHERE 子句移到 SUM() 内部意味着您不排除任何行,因此不要排除没有计费的工人。) p>

SELECT
  [EYH Export].Worker,
  SUM(CASE WHEN (([Job List].Billed)="Billed") THEN [EYH Export].Hours ELSE 0 END) AS [Billed Hours]
FROM
  [EYH Export]
INNER JOIN
  [Job List]
    ON [EYH Export].Client = [Job List].Client
GROUP BY
  [EYH Export].Worker;

如果不是所有客户端在Jobs List 中都有对应的行,请将连接更改为LEFT JOIN...

SELECT
  [EYH Export].Worker,
  SUM(CASE WHEN (([Job List].Billed)="Billed") THEN [EYH Export].Hours ELSE 0 END) AS [Billed Hours]
FROM
  [EYH Export]
LEFT JOIN
  [Job List]
    ON [EYH Export].Client = [Job List].Client
GROUP BY
  [EYH Export].Worker;

【讨论】:

    【解决方案2】:

    我将尝试回答您的基本要求。我认为,您本质上不是想要解决方案,而是要遵循、改进的道路:

    我真的非常感谢任何建议。仅仅为我指明正确的方向将是一个巨大的祝福

    因此,首先,您可能希望按照 Brad 的建议更改联接,因为目前(扣除)一个表包含所有客户,而一个不包含。通过这样做,您甚至可以获得丢失的客户,但会知道谁丢失了,这将我们带到下一个位,即iif(也请考虑nz)。你把它放在一个专栏里。您将测试空值,如果为空,则将 0 相加。

    路径就是这样。对于实际代码,我很乐意放弃对这样做的人的回答。

    【讨论】:

    • 仅更改联接无济于事。 WHERE 子句过滤LEFT JOINed 表(仅限计费客户),实质上将其恢复为INNER JOIN。然后,您可以将谓词从WHERE 移动到ON,但随后SUM() 将聚合非计费记录和计费记录。这个答案是误导性的。
    • 这是 OP 字面要求的路径。我也没有指定使用什么连接。只是加入的变化。但你的评论对他有帮助。所以我会赞成它,gj。
    猜你喜欢
    • 2011-02-21
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多