sql中的sum()函数与多个表一起使用时的数量加倍

Ank*_*ail 2 sql

我已经为解决方案敲了近14个小时,仍然无法找到解决方案.我会尽力让问题变得清晰.请帮帮我

我有2张桌子

  1. 现金
  2. MAS

表的结构就像

mas表

id - int

dateofissue - datetime

金额 - 浮动


现金表

id - int

日期 - 日期时间

金额 - 浮动


现在我想要的是制作一份月度报告,告诉日期明智的现金总额和主表

报告的结构就像


日期------------------掌握金额---------------现金金额

2/3/2012 -------------- 2000 ------------------------ 1000

3/3/2102 -------------- 4000 ------------------------ 200

...

....


mas表中的总金额和现金表中的金额总和根据mas表的日期和现金表中的日期进行分组.

我正在使用像SQL一样的SQL查询

     SELECT     sum(cash.amount) as CashAmount,  sum ( mas.amount) AS DraftAmount, mas.dateofissue
FROM         mas FULL OUTER JOIN
            cash ON cash.date = mas.dateofissue   
where mas.dateofissue >= '2012-03-01 00:00:00.000' and mas.dateofissue <= '2012-03-31 00:00:00.000' and 
cash.date >= '2012-03-01 00:00:00.000' and cash.date <= '2012-03-31 00:00:00.000'
group by mas.dateofissue
Run Code Online (Sandbox Code Playgroud)

现在查询有效,但是我搜索解决方案时聚合的数量增加一倍或三倍,并且有人告诉他们使用distinct作为和

总和(明显mas.ount)

但答案不正确.

我知道我不善于解释问题,但请帮助我.

谢谢.

Mat*_*lie 6

它不是SUM()导致加倍,而是JOIN.在完成JOIN之后完成SUM(),并且您的JOIN似乎匹配从一个talbe到另一个表中的两个记录的一条记录.

要么,您需要对表格进行重复数据删除以防止在您的联接中进行1:2匹配,或者预先汇总您的表格...


预处理选项:

SELECT
  COALESCE(mas.dateofissue, cash.date) AS date,
  cash.amount                          AS CashAmount,
  mas.amount                           AS DraftAmount
FROM
  (SELECT dateofissue, SUM(amount) as amount FROM mas GROUP BY dateofissue) AS mas
FULL OUTER JOIN
  (SELECT date, SUM(amount) as amount FROM cash GROUP BY date) AS cash
     ON cash.date = mas.dateofissue
WHERE
      (mas.dateofissue >= '2012-03-01 00:00:00.000' OR mas.dateofissue IS NULL)
  and (mas.dateofissue <= '2012-03-31 00:00:00.000' OR mas.dateofissue IS NULL)
  and (cash.date       >= '2012-03-01 00:00:00.000' OR cash.date       IS NULL)
  and (cash.date       <= '2012-03-31 00:00:00.000' OR cash.date       IS NULL)
Run Code Online (Sandbox Code Playgroud)


确定哪个表具有重复项:

SELECT dateofissue, COUNT(*) FROM mas  GROUP BY dateofissue HAVING COUNT(*) > 1
SELECT date,        COUNT(*) FROM cash GROUP BY date        HAVING COUNT(*) > 1
Run Code Online (Sandbox Code Playgroud)

编辑

我也注意到你FULL OUTER JOINWHERE条款中有一个和一个过滤器; 这迫使它重新成为一个INNER JOIN.

所以,我已经将上面的查询更改为实际工作FULL OUTER JOIN,在您的情况下还有其他方法可以执行此操作,例如在子查询中执行过滤,但我所做的更改应该有助于了解如何过滤FULL OUTER JOIN: )