具有联接和分组的DBF查询 - C#

时间:2017-10-02 14:01:04

标签: c# join group-by foxpro dbf

我的会计程序存储在DBF中的数据(我知道,很老)。我试图通过C#(VFPOLEDB)获取代理的未收集发票清单:client_id,发票日期,unpayed_amount(全部或部分),invoice_nr - 用于将来在Android平板电脑sqlite中插入。信息存储如下(摘要):

partners.dbf - partner catalog - client_id, agent
invoices.dbf - invoice table   - invoice nr, date, client_id, amount
payments.dbf - payments        - invoice nr, amount_payed

我尝试使用查询:

SELECT 
          a.invoice_nr, 
          a.client_id, 
          a.date, 
          ROUND(a.amount - SUM(b.amount_payed), 2) as due 
       from 
          invoices a 
             LEFT JOIN payments b 
                on a.invoice_nr = b.invoice_nr 
       WHERE 
          a.client_id IN ( SELECT client_id 
                              FROM partners 
                              WHERE agent= 'Some agent') 
       GROUP BY 
          a.invoice_nr, 
          a.client_id, 
          a.date, 
          a.amount 
       having 
          due != 0

有趣的是,在SQLite中运行正常。如果我尝试仅按a.invoice_nr分组,则会抛出Group By Clause无效的错误(我读到Group By必须包含select子句中的所有变量)

有人可以帮我调整此查询以满足我的需求吗?谢谢。

2 个答案:

答案 0 :(得分:0)

Foxpro中的引擎行为可能要求您在组中包含所有非聚合字段。您可以将该设置更改为引擎行为80或70.但为了简化,因为您知道给定的发票始终是相同的客户和日期,您可以更改为..

select
      a.invoice_nr, 
      max( a.client_id ) client_id,
      max( a.date ) date, ... rest of query

由于发票的客户和日期相同,因此对每个发票应用MAX()将始终为所述发票提供相同的值。

答案 1 :(得分:0)

找到答案:

Dim duplicates = input.GroupBy(Function(i) i.Number) _
                      .Where(Function(x) x.Count() > 1) _
                      .Any()