1

我有两个子查询都计算总和。我想用两个 Querys 的结果做一个 Artithmetic Minus(-) 。例如 Query1: 400 Query2: 300 结果应该是 100。

明显一个基本的- 在查询中不起作用。减号在集合上用作减号。我该如何解决这个问题?你有什么想法?

SELECT CustumersNo FROM Custumers WHERE
(
SELECT SUM(value) FROM roe WHERE roe.credit = Custumers.CustumersNo 
-
SELECT SUM(value) FROM roe WHERE roe.debit = Custumers.CustumersNo
)
> 500

使用 Informix - 抱歉错过了这一点

4

2 回答 2

1

像你尝试过的东西应该可以工作。这可能是语法问题,并且可能取决于您使用的 SQL 类型。但是,这样的方法会更有效:

更新:我看到您遇到了空值问题,因此我对其进行了更新以正确处理空值。

select CustumersNo from (
    select CustumersNo, 
           sum(coalesce(roecredit.value,0)) - sum(coalesce(roedebit.value,0)) 
               as balance 
        FROM Custumers 
        join roe roecredit on roe.credit = Custumers.CustumersNo 
        join roe roedebit on roe.debit = Custumers.CustumersNo 
        group by CustumersNo
    )
    where balance > 500

警告:我没有专门使用 Informix 的经验。

于 2012-10-03T13:11:10.153 回答
1

要使原始语法正常工作,您需要将子选择括在括号中:

SELECT CustumersNo
  FROM Custumers
 WHERE ((SELECT SUM(value) FROM roe WHERE roe.credit = Custumers.CustumersNo) 
        -
        (SELECT SUM(value) FROM roe WHERE roe.debit  = Custumers.CustumersNo)
       ) > 500

请注意,聚合被定义为忽略它们在标准 SQL 中聚合的值中的空值。但是,空行集的 SUM 为 NULL,而不是零。

您可以创造性地设计方法来始终为roe表中列出的每个客户提供价值,例如:

SELECT CustomersNo
  FROM (SELECT CustomersNo, SUM(value) AS net_credit
          FROM (SELECT credit AS CustomersNo, +value
                UNION
                SELECT debit  AS CustomersNo, -value
               ) AS x
         GROUP BY CustomersNo
       ) AS y
 WHERE net_credit > 500;

如果您愿意,也可以使用适当的 HAVING 子句来做到这一点。请注意,这可以避免有贷方分录但没有借方分录的客户出现问题,反之亦然;所有存在的条目都会得到适当的处理。


您对“客户”的拼写错误(或非正统拼写)几乎与“客户”一样好。

于 2012-10-03T18:27:49.473 回答