Добавление итогов по двум не связанным запросам MySQL - PullRequest
1 голос
/ 22 марта 2012

Я пытаюсь выработать правильный синтаксис MySQL, чтобы добавить результат двух запросов.Запросы извлекают записи о вызовах из таблицы, оба генерируют один результат, мне нужно сложить их вместе.Я уверен, что это можно сделать с помощью подзапроса, но я не могу понять синтаксис правильно.

Вот запросы:

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;

Как я уже сказал, я знаю, что это просто, но я просто не могу разобраться с синтаксисом подзапроса в MySQL!

Заранее спасибо

Джордж

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Как насчет -

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;
1 голос
/ 22 марта 2012

MySQL является гибким в 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 UNION внутри подзапросов. Если это так, то немного лучше использовать SUM() их через UNION:

SELECT SUM(total) as grand_total FROM
(
  SELECT SUM(costres) - SUM(costadmin) AS total
  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
  UNION ALL
  SELECT SUM(costcl) - SUM(costadmin) AS total
  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
) unionsub

Обновление:

Быстрый тест говорит мне, что вы можете использовать UNION ALL в подзапросе, по крайней мере, в MySQL 5.6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...