从两个不相关的MySQL查询中添加总计
我正在努力找出正确的MySQL语法来添加两个查询的结果。这些查询从一个表中提取调用记录,两者都生成一个数字结果,我需要将它们相加。我确信这可以通过子查询来完成,但我似乎无法获得正确的语法 以下是查询:从两个不相关的MySQL查询中添加总计,mysql,subquery,Mysql,Subquery,我正在努力找出正确的MySQL语法来添加两个查询的结果。这些查询从一个表中提取调用记录,两者都生成一个数字结果,我需要将它们相加。我确信这可以通过子查询来完成,但我似乎无法获得正确的语法 以下是查询: SELECT SUM(costres) - SUM(costadmin) FROM call_history, client WHERE MONTH(start) = 3 AND YEAR(start) = 2012 AND call_history.client_reseller_id =
SELECT SUM(costres) - SUM(costadmin)
FROM call_history, client
WHERE MONTH(start) = 3 AND YEAR(start) = 2012
AND call_history.client_reseller_id = client.id
AND client.charging_identifier <> 100000
AND client.charging_identifier <> 999999;
SELECT SUM(costcl) - SUM(costadmin)
FROM call_history, client
WHERE MONTH(start) = 3 AND YEAR(start) = 2012
AND call_history.client_reseller_id = client.id
AND client.charging_identifier = 100000
AND client.charging_identifier <> 999999;
选择总和(成本)-总和(成本管理)
从呼叫历史记录,客户端
其中月份(开始)=3年(开始)=2012年
并调用_history.client _reseller _id=client.id
和client.u标识符100000
和client.u标识符99999;
选择SUM(costcl)-SUM(costadmin)
从呼叫历史记录,客户端
其中月份(开始)=3年(开始)=2012年
并调用_history.client _reseller _id=client.id
和client.charging\u标识符=100000
和client.u标识符99999;
正如我所说,我知道这很简单,但我似乎无法理解MySQL中的子查询语法
提前谢谢
GeorgeMySQL在
SELECT
列表子查询中非常灵活,因此您可以执行如下操作,甚至不需要在主查询中使用FROM
子句
SELECT
(SELECT SUM(costres) - SUM(costadmin)
FROM call_history, client
WHERE MONTH(start) = 3 AND YEAR(start) = 2012
AND call_history.client_reseller_id = client.id
AND client.charging_identifier <> 100000
AND client.charging_identifier <> 999999
) + (
SELECT SUM(costcl) - SUM(costadmin)
FROM call_history, client
WHERE MONTH(start) = 3 AND YEAR(start) = 2012
AND call_history.client_reseller_id = client.id
AND client.charging_identifier = 100000
AND client.charging_identifier <> 999999
) AS yourSum;
更新:
快速测试告诉我,至少在MySQL 5.6中,您可以在子查询中使用UNION ALL
。如何-
SELECT
(SUM(IF(client.charging_identifier = 100000, costcl, 0)) - SUM(IF(client.charging_identifier = 100000, costadmin, 0))) +
(SUM(IF(client.charging_identifier <> 100000, costres, 0)) - SUM(IF(client.charging_identifier <> 100000, costadmin, 0)))
FROM call_history, client
WHERE MONTH(start) = 3 AND YEAR(start) = 2012
AND call_history.client_reseller_id = client.id
AND client.charging_identifier <> 999999;
选择
(总和(如果(client.charging\u identifier=100000,costcl,0))-总和(如果(client.charging\u identifier=100000,costadmin,0)))+
(总和(如果(client.charging\u标识符100000,成本,0))-总和(如果(client.charging\u标识符100000,成本管理,0)))
从呼叫历史记录,客户端
其中月份(开始)=3年(开始)=2012年
并调用_history.client _reseller _id=client.id
和client.u标识符99999;
您想要两行还是一行两列?真的,我只想要两个查询的一个总数,或者一个查询的等价物。哇,太快了!谢谢两位。这么简单,我就知道会是这样。将测试并报告。Michael,您的第二个查询工作正常-第一个也正常,但正如您所说的,有点不太优雅。@B Tongeorge很好,很乐意提供帮助。非常好,这非常有效,比运行两个查询更快。非常感谢所有做出贡献的人。
SELECT
(SUM(IF(client.charging_identifier = 100000, costcl, 0)) - SUM(IF(client.charging_identifier = 100000, costadmin, 0))) +
(SUM(IF(client.charging_identifier <> 100000, costres, 0)) - SUM(IF(client.charging_identifier <> 100000, costadmin, 0)))
FROM call_history, client
WHERE MONTH(start) = 3 AND YEAR(start) = 2012
AND call_history.client_reseller_id = client.id
AND client.charging_identifier <> 999999;