访问2016& SQL:总计两列,然后减去它们

时间:2017-08-16 13:40:23

标签: sql ms-access

说我有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 |
    +-------------+-------+----------+-----------+-----------+

2 个答案:

答案 0 :(得分:0)

如果没有样本数据,有点不清楚您的期望,但我认为这就是您想要的:

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

这将从每个不同的MoneyOut

中减去MoneyIn的{​​{1}}的总和

更新了答案

DateOf可以让您追加“总计”'记录到结果集的底部:

UNION

一些注意事项..我使用派生表来确保总计&#39;记录是最后的。还将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),否则您将遇到写字符串的问题&#39; Total:&#39;到那一栏。

答案 1 :(得分:0)

以下内容可为您提供所需内容:

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]; 

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