使用2个子查询进行数学运算

时间:2012-10-03 13:02:03

标签: sql informix

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

显而易见的基本 - 在查询中不起作用。减号在集合上作为MINUS。我怎么解决这个问题?你有什么想法吗?

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 - 抱歉错过了这一点

2 个答案:

答案 0 :(得分:1)

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

更新:我发现你遇到了null问题,所以我更新了它以正确处理空值。

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的经验。

答案 1 :(得分: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子句。请注意,这可以避免出现信用条目但没有借方条目的客户的问题,反之亦然;所有存在的条目都得到适当的处理。


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