SQL GROUP BY子句不会生成不同的行

时间:2012-01-16 21:38:51

标签: sql group-by visual-foxpro

我有两张桌子:

  • t1date d, name c(20), debit n(7), credit n(7)
  • t2date 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 incomemedical在查询输出中出现两次,尽管使用了GROUP BY子句?我已经尝试在列 t2.type 之前添加DISTINCT子句,这也产生相同的输出!我可以观察到的一件事是表 t2 中的类型 medical的两条记录在 t1 中没有匹配相同的记录< em> name 和 type income的两条记录在 t2 中具有非零 obal 。请帮我解决这个问题。

4 个答案:

答案 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