【问题标题】:SQL looping Cartesian ProductSQL循环笛卡尔积
【发布时间】:2014-01-15 17:21:08
【问题描述】:

我在 SQL 方面的经验有限,我目前正在做一个小项目,以从不同的表创建视图。但是我在结果中不断得到一个笛卡尔积。

我正在使用 3 个表格,第一个表格包含每个分支的信息,第二个表格包含帐号和名称,第三个表格包含每月总计。我想创建一个视图,其中每一行都有帐号,后跟每个月的一列。

ACCT 表 - 编号(主键)、帐户编号、帐户名称和其他对该项目不重要的列。

TOTAL 表 - 分支编号(指向 BRANCH 表)、月份(MM-YYYY 格式)、Acct Number(指向 ACCT 表的主键)和每月总计列。

Acct - Acct Name - Jan Amount - Feb Amount - Mar Amount .....Dec Amount

我想做类似 for-each 循环(对于每个帐户,显示每月总计),但由于 SQL 没有该选项,我做了以下操作。此时我什至没有加入分支表,并且只选择了 2 个月,我得到了笛卡尔积。

select a.scode glacct, a.sdesc glacctdescp,
t1.smtd Amt01, t2.smtd Amt02
from acct a
inner join total t1 on a.hmy = t1.hacct and t1.umonth = '2013-01-01' and t1.ibook = '1'
left outer join total t2 on a.hmy = t2.hacct and t2.umonth = '2013-02-01' and t2.ibook = '1'

如果您能告诉我如何修复内部连接语句,我将不胜感激,因为这是我遇到的问题。它单独为我提供了我正在寻找的信息,但连接不起作用。

谢谢

【问题讨论】:

  • 您的查询看起来没问题。你为什么认为你得到一个笛卡尔积?
  • 我每个月都会获得大约 9000 条记录,但在这个组合查询中,我的结果在 430,000 条范围内。
  • 请告诉我们这是什么 DBMS,并为我们提供相关列的实际表定义和任何键。不过,很可能,我猜a.hmy = t1.umonth 不是一个足够独特的条件。
  • DBMS 是 Microsoft SQL。 Total 表中只有 6 列。 1 是 Branch 表的句柄,1 是 Acct 表的句柄,1 列是月份,1 列用于 ibook,其余 2 列包含金额。所以我唯一可以有效地用于条件的是 ACCT 和 Branch 表的句柄。

标签: sql foreach cartesian-product


【解决方案1】:

在mysql中,如果你想按月计算,应该是这样的

select a.scode glacct, a.sdesc glacctdescp
sum(case when month(t.umonth) = 1 then t.smtd else 0 end) as JanuaryAmount,
sum(case when month(t.umonth) = 2 then t.smtd else 0 end)as FebruaryAmount,
sum(case when month(t.umonth) = 3 then t.smtd else 0 end) as MarchAmount
--etc.
from acct a
inner join total t on a.hmy = t.hacct
where year(t.umonth)=2013
and t.ibook = 1
group by a.scode, a.sdesc

【讨论】:

    【解决方案2】:

    Raphael 的回答可能非常接近,您使用笛卡尔积的主要原因是您没有对细节线进行分组和求和,我认为这是您的目标。另一种方法是简单地按年、月和帐户分组,这样您就可以在数据集中每年每个月为每个帐户获得一个结果行。

    select a.scode glacct, a.sdesc glacctdescp,
    sum(t1.smtd)
    from acct a
    inner join total t1 on a.hmy = t1.hacct and t1.umonth = '2013-01-01' and t1.ibook = '1'
    left outer join total t2 on a.hmy = t2.hacct and t2.umonth = '2013-02-01' and t2.ibook = '1'
    Group by Year(t1.umonth), Month(t1.umonth),glacct,a.scode
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      相关资源
      最近更新 更多