我对SQL的经验有限,我目前正在开发一个小项目来创建来自不同表的视图。但是我在结果中不断得到笛卡尔积。
我正在使用3个表,第一个表有每个分支的信息,第二个表有帐号和名称,第三个表有月总数。我想创建一个视图,其中每行都有帐号,后面跟着每个月的列。
ACCT表 - 数字(主键),帐号,帐号和一堆对此项目不重要的其他列。
TOTAL表 - 分支号码(指向BRANCH表),月份(MM-YYYY格式),帐号(指向ACCT表的主键)和月总计列。
帐户 - 帐户名称 - 1月金额 - 2月金额 - 3月金额..... 12月金额
我想做一些像for-each循环(对于每个acct,显示每月总计),但由于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'
如果您能告诉我如何修复内部联接语句,我将不胜感激,因为这是我遇到问题的地方。它个别地提供了我正在寻找的信息,但加入不起作用。
由于
答案 0 :(得分:0)
,如果你想按月计算总数,那应该是那样的
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
答案 1 :(得分:0)
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