【问题标题】:SQL GROUP BY clause does not produce distinct rowsSQL GROUP BY 子句不产生不同的行
【发布时间】:2012-01-16 21:38:50
【问题描述】:

我有两张桌子:

  • 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

我的问题是:尽管使用了 GROUP BY 子句,为什么 type incomemedical 在查询输出中出现两次?我尝试在 t2.type 列之前添加 DISTINCT 子句,这也产生了相同的输出!我可以观察到的一件事是 type medicalt2 中的两条记录在 t1 中没有匹配相同 的记录nametype 的两条记录 incomet2 中有一个非零 obal。请帮我解决这个问题。

【问题讨论】:

  • 抱歉没有提及数据库信息。我在 Windows 7 上使用 Microsoft Visual Foxpro 9.0。

标签: sql group-by visual-foxpro


【解决方案1】:

您是GROUPing type, obal 的不同组合

如果您只对type 进行分组,那么每种类型的条目都不会重复,但您需要决定如何处理obal 字段。

【讨论】:

    【解决方案2】:

    您有两个分组列:....

    GROUP BY t2.type, t2.obal
    

    数据库通过两个值的不同组合对值进行分组!

    【讨论】:

      【解决方案3】:

      问题是您不仅按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;
      

      【讨论】:

      • 这在 MS VFP 9.0 中不起作用,但是当作为两个查询执行时它是完美的。非常感谢:-)
      【解决方案4】:

      从您的 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
      

      【讨论】:

      • 抱歉没有提及数据库信息。我在 Windows 7 上使用 Microsoft Visual Foxpro 9.0。
      • 删除 GROUP BY 子句中的 obal 会产生错误 'GROUP BY' 子句丢失或无效!
      • @Ganapathy 据我了解您的数据库的文档,现在调用该函数(我对其进行了编辑)应该可以工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-29
      • 2018-03-23
      • 1970-01-01
      • 2022-01-13
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多