【问题标题】:Access 2016 & SQL: Totaling two columns, then subtracting themAccess 2016 和 SQL:总计两列,然后减去它们
【发布时间】:2017-08-16 13:40:23
【问题描述】:

假设我有一个 MoneyIN 和一个 MoneyOUT 列。我希望将这些整个列加起来,这样我就有了每个列的总和,然后我希望从 MoneyIN 列的总数中减去 MoneyOUT 列的总数。我还想显示一个 DateOF 列,可能还有一个描述(我想我可以自己做)。

这将是我从中获取信息的原始数据库:

 +-------------+------------------+---------+----------+-----------+
    | Location ID | Location Address | Date Of | Money In | Money Out |
    +-------------+------------------+---------+----------+-----------+
    |           1 | blah             | date    |    10.00 |      0.00 |
    |           2 | blah             | date    | 2,027.10 |     27.10 |
    |           2 | blah             | date    |     0.00 |   2000.00 |
    |           1 | blah             | date    |     0.00 |     10.00 |
    |           3 | blah             | date    |  5000.00 |      0.00 |
    +-------------+------------------+---------+----------+-----------+

我希望能够输入位置 ID,然后显示结果(在本例中,我输入 2 作为位置)

+---------+----------+-----------+------+
| Date Of | Money In | Money Out |      |
+---------+----------+-----------+------+
| date    |  2027.10 |     27.10 |      |
| date    |        0 |      2000 |      |
| Total:  |  2027.10 |   2027.10 | 0 |
+---------+----------+-----------+------+

我尝试了其他解决方案(其中一个在下面指出),但是,它们不显示每一整列的总和,它们只是从每行的 MoneyIN 中减去 MoneyOUT。截至目前,我正在尝试在查询中执行此操作,但如果有更好的方法,请详细说明。 我对 SQL 和 Access 非常陌生,所以请让像我这样的初学者可以理解解释。非常感谢!

这是下面提到的表格。

    +-------------+-------+----------+-----------+-----------+
    | Location ID | Date  | Money IN | Money Out | Total Sum |
    +-------------+-------+----------+-----------+-----------+
    |           1 | date  |      300 |       200 |           |
    |           1 | date  |      300 |       200 |           |
    |           1 | date  |      300 |       200 |           |
    |           1 | total |      900 |       600 |       300 |
    +-------------+-------+----------+-----------+-----------+

【问题讨论】:

  • 那么你想看看 270、50 和 220 吗?还是只有220?要不然是啥?以网格格式显示样本数据和预期结果。 (在 excel 中模拟,然后使用 ozh.github.io/ascii-tables 将其转换为 ascii 表并将其粘贴到您的问题中,格式为代码。)一张好的 ascii 图片值 1000 个字!

标签: sql ms-access


【解决方案1】:

以下内容应该可以满足您的需求:

SELECT DateOf, MoneyIn, MoneyOut, '' AS TotalSum FROM YourTable
UNION
SELECT 'Total', SUM(MoneyIn) AS SumIn, SUM(MoneyOut) AS SumOut, 
SUM(MoneyIn - MoneyOut) AS TotalSum FROM YourTable

编辑:

你不需要做太多的改变来达到你想要的。为了让 Access 在运行查询时提示输入参数,请在方括号中为参数命名;然后 Access 将弹出一个窗口,提示用户输入此值。此外,此参数可以在查询中多次使用,而无需 Access 多次提示。因此,以下内容应该适合您:

SELECT DateOf, MoneyIn, MoneyOut, '' AS TotalSum
FROM YourTable
WHERE LocationID=[Location ID]
UNION 
SELECT 'Total', SUM(MoneyIn) AS SumIn, SUM(MoneyOut) AS SumOut, 
SUM(MoneyIn - MoneyOut) AS TotalSum FROM YourTable
WHERE LocationID=[Location ID]; 

但是,看看您的桌子设计,我强烈建议您更改它。您在每条记录中都包含地址。如果您有 3 个位置,但有 100 条记录,那么平均而言,您不必要地重复每个地址超过 30 次。避免这种情况的“正常”方法是使用第二个表 Locations,其中包含一个 ID 和一个地址字段。然后,您从 YourTable 中删除地址,并在其位置创建 Locations 中的 ID 和 YourTable 中的 LocationID 之间的一对多关系。

【讨论】:

  • 当我运行代码时,我所理解的是它正在从我的表中获取所有信息,然后根据需要将它们全部添加。但是,有一个小问题,它只能从每个输入(Money In 和 Money Out)中获取一个输入。例如,如果我有许多事务,我将如何更改它以接受表中的许多不同值?另外,如果我想限制某个位置下的结果(来自许多位置的许多事务),我会使用 WHERE ((([yourtable].[LocationID])=[Insert LocationID])); ?谢谢你的建议!
  • 为了帮助您更多,我需要表格结构、一些示例数据和给定示例数据,您希望结果看起来像什么。大多数事情都是可能的,我们只需要一个提示!如果你能提供这个,我会在早上做点什么——这里已经快晚上 10 点了?
  • 我已经用我从中获取信息的表格、示例数据和结果更新了上面的帖子。我会期待你的回答!感谢您的所有帮助!
  • 请求 MoneyIn 和 Money Out 的代码仍然存在问题,它只取 1 个值。详细来说,它会提示 MoneyIn(我输入 300),它会提示 Money Out(我输入 200),然后提示 LocationID,在这种情况下我输入正确的位置并输出类似这样的内容(我将其添加到下面的帖子中一切)
  • 你的字段名是什么?我的是 MoneyIn 和 MoneyOut?如果您的字段名称不同,您需要将我的替换为您的以停止访问,提示您输入不存在的名称。请注意,使用带空格的名称不是一个好主意,否则您必须在任何地方使用方括号
【解决方案2】:

在没有样本数据的情况下,您究竟期望什么有点不清楚,但我认为这就是您想要的:

SELECT DateOf, SUM(MoneyIN) - SUM(MoneyOut)
FROM YourTable
GROUP BY DateOf

这将从MoneyIn 在每个不同的DateOf 中减去MoneyOut 的总和

更新答案

UNION 可让您将“总计”记录附加到结果集的底部:

SELECT *
FROM (
      SELECT CAST(DateOf as varchar(20)) as DateOf, MoneyIn, MoneyOut, '' as NetMoneyIn
      FROM YourTable
      UNION
      SELECT 'Total:', SUM(MoneyIn), SUM(MoneyOut), SUM(MoneyIN) - SUM(MoneyOut)
      FROM YourTable
      ) A
ORDER BY CASE WHEN DateOf <> 'Total:' THEN 0 ELSE 1 END, DateOf

一些注意事项.. 我使用派生表来确保“总计”记录在最后。还将DateOf 转换为字符串(假设它是date),否则您将无法将字符串“Total:”写入该列。

【讨论】:

  • 问题是我不希望它在每个日期都减去。我希望对整列进行总计。然后我想在一个查询中减去它。正如 xQbert 所指出的,我在上面添加了一些示例数据。这是我已经尝试过的方法(我应该指定)。感谢您的快速反馈!
猜你喜欢
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2017-11-21
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多