我已经为解决方案敲了近14个小时,仍然无法找到解决方案.我会尽力让问题变得清晰.请帮帮我
我有2张桌子
表的结构就像
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)
但答案不正确.
我知道我不善于解释问题,但请帮助我.
谢谢.
它不是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 JOIN在WHERE条款中有一个和一个过滤器; 这迫使它重新成为一个INNER JOIN.
所以,我已经将上面的查询更改为实际工作FULL OUTER JOIN,在您的情况下还有其他方法可以执行此操作,例如在子查询中执行过滤,但我所做的更改应该有助于了解如何过滤FULL OUTER JOIN: )
| 归档时间: |
|
| 查看次数: |
6863 次 |
| 最近记录: |