我有两张桌子:
t1
(date d, name c(20), debit n(7), credit n(7)
)t2
(date d, name c(20), type c(25), obal n(7)
)这是示例数据。
T1:
DATE NAME DEBIT CREDIT
01.01.12 dad 5000
01.01.12 mum 6000
05.01.12 school 1000
01.02.12 dad 5000
01.02.12 mum 6000
10.02.12 tuition 300
10.02.12 snacks 100
01.03.12 dad 5000
01.03.12 mum 6000
01.03.12 books 500
02.03.12 rice 500
02.03.12 vegetables 900
03.03.12 snacks 100
01.04.12 dad 5000
01.04.12 mum 6000
01.04.12 meat 200
21.04.12 guest 800
T2:
DATE NAME TYPE OBAL
01.01.12 dr fee medical 8000
01.01.12 medicine medical -10000
01.01.12 dad income 400000
01.01.12 mum income 450000
05.01.12 school education 0
10.02.12 tuition education 0
10.02.12 snacks misc 0
01.03.12 books education 0
02.03.12 rice food 0
02.03.12 vegetables food 0
01.04.12 meat food 0
21.04.12 guest misc 0
预期按类型(t2)分组的每个名称的(obal + credit-debit)总和。使用的查询和获得的输出是:
SELECT
t2.type, obal + SUM(NVL(credit - debit, 0)) as bal
FROM t2
LEFT JOIN t1 ON t2.name = t1.name
GROUP BY
t2.type, t2.obal
结果:
TYPE BAL
education -1800
food -1600
income 420000
income 474000
medical -10000
medical 8000
misc -1000
我的问题是:为什么 type income
和medical
在查询输出中出现两次,尽管使用了GROUP BY子句?我已经尝试在列 t2.type 之前添加DISTINCT子句,这也产生相同的输出!我可以观察到的一件事是表 t2 中的类型 medical
的两条记录在 t1 中没有匹配相同的记录< em> name 和 type income
的两条记录在 t2 中具有非零 obal 。请帮我解决这个问题。
答案 0 :(得分:2)
您有两个分组列:....
GROUP BY t2.type, t2.obal
数据库按值的不同组合对值进行分组!
答案 1 :(得分:2)
您GROUP
type, obal
的{strong}组合。
如果您只对type
进行分组,那么每种类型都不会有重复的条目,但您需要决定如何处理obal
字段。
答案 2 :(得分:1)
问题在于,您不是仅按type
分组,而是obal
分组。
尝试:
select type,sum(bal) as bal
from(
SELECT t2.type, obal + SUM(NVL(credit - debit, 0)) as bal FROM t2 LEFT JOIN t1 ;
ON t2.name = t1.name GROUP BY t2.type, t2.obal
)a
group by type;
答案 3 :(得分:0)
从你的group by子句中删除t2.obal。
SELECT t2.type, SUM(NVL(credit - debit, 0), obal) as bal
FROM t2 LEFT JOIN t1 ON t2.name = t1.name
GROUP BY t2.type