我有两个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 - 抱歉错过了这一点
答案 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子句。请注意,这可以避免出现信用条目但没有借方条目的客户的问题,反之亦然;所有存在的条目都得到适当的处理。
您对'客户'的拼写错误(或非正统拼写)几乎和'客户'一样好。