【问题标题】:Trying to figure out a solution to this question试图找出这个问题的解决方案
【发布时间】:2019-10-04 14:27:33
【问题描述】:

消除 SQL 中的重复答案和不匹配

所以问题是我需要找到每天发生的交易,我的答案与正确答案不匹配,我不知道为什么!

这是一个简短的数据库描述“回收公司”

该公司拥有多个回收中心,用于收集可回收材料。他们每个人都收到了支付给可回收物供应商的资金。收到的资金数据记录在表中 收入_o(点,日期,公司) 主键为(point, date),其中point持有回购中心的标识,日期对应资金到账的日历日期。日期列不包括时间部分,因此,每个中心每天到达的钱(inc)不超过一次。表中列出了向可回收供应商付款的信息 结果_o(点,日期,出) 在此表中,主键(点、日期)确保每个回购中心每天报告的付款(出)不超过一次。 对于收入和支出可能每天发生多次的情况,使用另一个数据库模式,其中表的主键由单列代码组成: 收入(代码、点、日期、公司) 结果(代码、点、日期、出) 在这里,日期列也不包含时间部分。

问题是: 假设每个收款点每天可以多次登记收款 (inc) 和支出 (out) [即码列为主键],显示一个表格,每个采集点的每个操作日期对应一行。 结果集:点、日期、每天的总支出(out)、每天的总收入(inc)。 缺失值被视为 NULL。

SELECT Income.point, Income."date", SUM("out"), SUM(inc)
FROM Income left JOIN 
 Outcome ON Income.point = Outcome.point AND
 Income."date" = Outcome."date" 

GROUP BY Income.point, Income."date"
UNION 
SELECT Outcome.point, Outcome."date", SUM("out"), SUM(inc)
FROM Outcome left JOIN 
 Income ON Income.point = Outcome.point AND
 Income."date" = Outcome."date" 

GROUP BY Outcome.point, Outcome."date";

【问题讨论】:

  • 如果您对收入和结果进行一些创建表语句和数据,以及您对样本数据的预期结果,可能会得到更好的响应。您可以前往 sqlfiddle.com 并选择 oracle 作为下拉菜单
  • 另外,关于 SO 的每个问题都是“试图找出解决这个问题的方法”。请选择一个更好的标题。
  • 对不起,我是新手,这是我第一次,下次会更好。

标签: sql oracle


【解决方案1】:

我的猜测是,通过不将 CODE 作为连接条件的一部分,您有一点笛卡尔连接。我认为以下查询应该适合您的需求:

WITH calendar AS
(
  SELECT TRUNC(SYSDATE)-(LEVEL-1) AS DT
  FROM DUAL
  CONNECT BY LEVEL < 30
)
SELECT d.pnt AS "POINT",
       c.dt AS "DATE",
       d.outcome_total,
       d.income_total
FROM calendar c
LEFT JOIN (SELECT nvl(inc.pnt, outc.pnt) AS PNT,
                  nvl(inc.dt, outc.dt) AS DT,
                  outc.amt AS OUTCOME_TOTAL,
                  inc.amt AS INCOME_TOTAL
           FROM (SELECT i.pnt, i.dt, sum(i.inc) AS AMT
                 FROM income i
                 GROUP BY i.pnt, i.dt) inc
           FULL JOIN (SELECT o.pnt, o.dt, sum(o.inc) AS AMT
                      FROM outcome o
                      GROUP BY o.pnt, o.dt) outc ON inc.pnt = outc.pnt AND inc.dt = outc.dt) d ON c.dt = d.dt;

我添加了日历表来说明某一天既没有收入也没有结果的情况。但是,如果您不需要,LEFT JOIN 中的查询应该没问题。

注意:添加日历 WITH 子句后,此查询当前将仅显示上个月的结果(-ish)。如果您需要更长的时间,请调整 30 天窗口。

【讨论】:

  • 我提到的笛卡尔连接只会在有多种收入和多种结果的日子给你带来问题。因此,您的大部分数据可能看起来都不错。只是那些忙碌的日子才会结束。
  • @afbigdad 等人:我修复了一些列名问题和缺少逗号,现在应该可以编译了。让我知道这是否解决了您的问题。
  • 它给了我这个错误代码:(933) ORA-00933: SQL 命令没有正确结束
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2020-12-15
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
相关资源
最近更新 更多