1

我无法让 MySQL 查询为我工作。这是设置。

一位客户要求我根据一些会计数据编制一份报告。他想选择一个日期(可能还有其他标准)并让它返回以下所有内容(OR 语句):1.) 在该日期或之后插入的所有发票 2.) 所有发票,无论其插入日期如何在单独的表中具有相应的付款,其插入日期在所选日期或之后。

第一个子句是基本的,但我无法将它与第二个子句配对。

我在 SQL Fiddle 中组装了一组可比较的测试数据。提供了我当前拥有的查询。 http://www.sqlfiddle.com/#!2/d8d9c/3/2

正如小提琴评论中所指出的,我将 2013 年 7 月 1 日作为我选择的日期。为了使测试正常工作,我需要显示发票 1 到 5,但不需要显示发票 #6。

4

2 回答 2

0

试试这个:http ://www.sqlfiddle.com/#!2/d8d9c/9 这里是总结的变化

  1. 我摆脱了你的GROUP BY. 您没有任何聚合函数。我用来DISTINCT消除重复记录
  2. 我删除了您的隐式连接并将显式连接放在它们的位置以提高可读性。然后我将它们更改为 LEFT JOIN。我不确定您的数据是什么样的,但至少,如果您想选择没有付款的发票,我会假设您需要付款 LEFT JOINed。
  3. 这可能会为您提供所需的记录,但是SELECT子句中的那些子选择作为 LEFT JOIN 可能比使用 SUM 函数执行得更好

这是查询

SELECT DISTINCT
    a.abbr landowner,
    CONCAT(f.ForestLabel, '-', l.serial, '-', l.revision) leasenumber,
    i.iid,
    FROM_UNIXTIME(i.dateadded,'%M %d, %Y') InvoiceDate,
    (SELECT IFNULL(SUM(ch.amount), 0.00) n FROM test_charges ch WHERE ch.invoiceid = i.iid) totalBilled,
    (SELECT SUM(p1.amount) n FROM test_payments p1 WHERE p1.invoiceid = i.iid AND p1.transtype = 'check' AND p1.status = 2) checks,
    (SELECT SUM(p1.amount) n FROM test_payments p1 WHERE p1.invoiceid = i.iid AND p1.transtype = 'ach' AND p1.status = 2) ach,
    CASE WHEN i.totalbilled < 0 THEN i.totalbilled * -1 ELSE 0.00 END credits,
    CASE WHEN i.balance >= 0 THEN i.balance ELSE 0.00 END balance,
    t.typelabel, g.groupname
FROM test_invoices i
LEFT JOIN test_contracts c
  ON     i.contractid = c.cid 
LEFT JOIN test_leases l
  ON c.leaseid = l.bid
LEFT JOIN test_forest f
  ON l.forest = f.ForestID
LEFT JOIN test_leasetypes t
  ON l.leasetype = t.tid
LEFT JOIN test_accounts a
  ON l.account = a.aid
LEFT JOIN test_groups g
  ON c.groupid = g.gid
LEFT JOIN test_payments p
  ON p.invoiceid = i.iid
WHERE (i.dateadded >= @startdate) OR (p.dateadded >= @startdate)
于 2013-10-22T18:05:04.940 回答
0

尝试这个。

http://www.sqlfiddle.com/#!2/d8d9c/11/2

TL;博士:

… AND (i.dateadded > @startdate
     OR EXISTS (
       SELECT * FROM test_payments
       WHERE test_payments.invoiceid = i.iid
       AND  test_payments.dateadded >= @startdate))
于 2013-10-22T18:10:30.817 回答