【问题标题】:how can i have my sql show the sum of 2 tables at the same time?我怎样才能让我的 sql 同时显示 2 个表的总和?
【发布时间】:2013-12-02 03:23:01
【问题描述】:

我试图显示每月账单总额和增值税总额(该客户支付增值税)和所有总额(bill_total + 增值税)的总和的结果。但是,我的 sql 命令执行后什么也没有显示。所以你能帮我吗,因为我的sql知识太有限了。

我的桌子在下面

tbl_bill_total

bill_id | bill_total | cust_id | showndate 
  1     |   1000     |   12    |  12/10/13
  2     |   1200     |   13    |  1/11/13
  3     |   500      |   12    |  3/11/13

tbl_vat_bill_total

vat_id  |  vat_total |  if_paid| showndate | cust_id 
  1     |    400     |   false |  13/10/13 |  14
  2     |    500     |   true  |  14/11/13 |  12
  3     |    100     |   false |  15/11/13 |  11
  4     |    200     |   true  |  20/11/13 |  12

预期的结果应该是这样的

bill_total  |  vat_total | Sum_of_all | month
  1000      |    0       |   1000     |  10
  1700      |    700     |   2400     |  11

非常感谢

** 抱歉,我改变了预期结果……因为它是年度报告,所以结果应该列出一年内的所有销售额。 *

下面是我失败的尝试...

SELECT 
    Sum(tbl_bill_total.bill_total) AS bill_totalOfSum, 
    Sum(tbl_vat_bill_total.vat_total) AS vat_totalOfSum, 
    tbl_vat_bill_total.if_paid, 
    Month([tbl_bill_total.showndate]) AS month1
FROM 
    tbl_bill_total 
    INNER JOIN 
    tbl_vat_bill_total 
        ON tbl_bill_total.cust_id = tbl_vat_bill_total.cust_id
GROUP BY 
    tbl_vat_bill_total.if_paid, 
    Month([tbl_bill_total.showndate])
HAVING (((tbl_vat_bill_total.if_paid)=True));

【问题讨论】:

  • 是否可以在当月没有相应的账单总额的情况下获得当月的已付增值税总额?哦,你的尝试是什么?
  • 我试图创建一个年度报告,显示每个月不含增值税和增值税(客户已向我们支付 (if_paid = true))的销售收入并显示总和这两个值同时进行。
  • 我已经收集到了,是否总是有两个值是我的问题。如果有,Month(shownDate) 上的左连接将起作用,但是如果您可以在一个月内有增值税记录而该月没有相应的账单,则需要进行更多查询,如左连接右连接。或临时表/中间查询..
  • 没有.. 某个月将没有增值税总额。你能给我sql命令吗?正如我之前提到的,我的 sql 知识确实有限。虽然我了解它如何检索的逻辑,但我无法想出它的语法和命令。再次感谢您。
  • 抱歉,我的输出已更改。这个新的记录样本应该能更多地解释我想从这个结果中得到什么。

标签: sql ms-access-2007


【解决方案1】:

好的,我有一段时间没有使用 Access,但我认为以下应该可以工作:

select 
    sum(tbt.bill_total) as bill_total_
    ,iif(sum_vat_total is null, 0, sum_vat_total) as vat_total_
    ,iif(sum_vat_total is null, 0, sum_vat_total) + sum(bill_total) as sum_of_all
    ,month(showndate) as month
from tbl_bill_total tbt
left join (
    select 
        sum(vat_total) as sum_vat_total
        ,month(showndate) as month
    from tbl_vat_bill_total
    where if_paid = true
        and year(showndate) = 2013
    group by 
        month(showndate)
    ) tvt
        on tvt.month = month(tbt.showndate) 
where year(showndate) = 2013
group by 
    month(showndate)
    ,sum_vat_total

当然,这假设您每个月在tbl_bill_total 中至少有一条记录,因为这是我们month 字段的来源。

如果您有几个月有 tbl_vat_bill_total 记录但没有 tbl_bill_total 记录(或两个表中都没有记录),您将需要更复杂的解决方案 - 可能使用 date table

【讨论】:

  • 那么错误是什么?
  • @Alxan 我将该查询复制并粘贴到 Access 2010 中,对我来说效果很好。
  • 对不起!我的错。这是工作。但是,我如何才能获得仅来自 2013 年的结果?我试图将年份条件放在声明中,但我失败了。非常感谢。
  • 将 where year(ShownDate) = 2013 添加到第一个选择(在最后一组 By 之前),然后将 and year(ShownDate) = 2013 添加到第二个。
  • Alxan 和@Tony 我已根据新要求和建议更新了帖子。这现在应该只对 2013 年的交易进行汇总
【解决方案2】:

创建一个这样的查询,称为 q_bill_sum

Select Sum(bill_total) as total, 'Bill' as Total_Type, Month(showndate) as bill_Month
From tbl_bill_total
Where Year(showndate) = 2013
group by Total_Type, Bill_month
Union
Select Sum(vat_total), 'Vat' as Total_Type, Month(showndate) as bill_month
From tbl_vat_bill_total
Where Year(showndate) = 2013 and if_paid = true
group by Total_Type, Bill_month

你最终得到

1000 Bill 10
1700 Bill 11
0    Vat  10
700  Vat  11

然后

Select b.Total, ifnull(v.total,0), b.bill_Month
From q_bill_sum b 
left join q_bill_sum v On v.Bill_month = b.Bill_month

应该很接近,但你从来没有回答我关于一个月内有增值税而一个月内没有账单的问题。

我认为无论如何,访问权限并不是我的强项,但是当我必须执行一个功能很多的查询时,我总是将其分解为几部分,然后当它起作用时,如果它看起来很糟糕,我会尝试简化.. .

【讨论】:

  • 对不起,我以为我已经回答过了。答案是“是的”,某个月将没有增值税。 Bill_total 每个月都有价值。
  • 我已尝试执行您的 sql 命令,但出现错误提示“查询定义的 SELECT 列表中的别名 'vas_total' 导致循环引用。”
  • 问题又来了,是否有一个月有增值税但没有账单,如 11 月未支付 11 月账单,然后在 12 月支付。如果这不能发生,那么上面应该是关闭的。
  • 编辑查询以取出别名,应该消除该错误
  • 在编辑之后,它说“您试图执行一个不包含指定表达式“月(显示日期)”的查询作为聚合函数的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 2021-09-24
相关资源
最近更新 更多