gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:28:21 24 4
gpt4 key购买 nike

我已经苦苦思索了将近 14 个小时,但仍然找不到解决方案。我会尽力让我的问题尽可能清楚。请帮帮我

我有两张 table

  1. 现金
  2. 春节

表的结构是这样的

mas表

id - 整数

发行日期 - 日期时间

金额 - float


收银台

id - 整数

日期 - 日期时间

金额 - float


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

报告的结构是这样的


日期----------------主金额----------------现金金额

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

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

...

....


mas 表的总金额和 cash 表的总金额根据 mas 表的 dateofissue 和 cash 表的日期分组。

我正在使用类似的 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

现在查询有效,但聚合的金额增加了一倍或三倍我搜索了一个解决方案,有人告诉我使用 distinct 和 sum作为

sum(distinct mas.amount)

但答案不正确。

我知道我不擅长解释问题,但请在这里帮助我。

谢谢。

最佳答案

导致加倍的不是 SUM(),而是 JOIN。 SUM() 在您完成 JOIN 后完成,并且您的 JOIN 似乎将一个表中的一条记录与另一个表中的两条记录相匹配。

要么,您需要对表进行重复数据删除以防止在连接中进行 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)


识别哪个表有重复项:

SELECT dateofissue, COUNT(*) FROM mas  GROUP BY dateofissue HAVING COUNT(*) > 1
SELECT date, COUNT(*) FROM cash GROUP BY date HAVING COUNT(*) > 1

编辑

我还注意到您在 WHERE 子句中有一个 FULL OUTER JOIN 和一个过滤器;这迫使它重新成为 INNER JOIN

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

关于sql - sql中的sum()函数在与多个表一起使用时将数量加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9885731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com