2016-06-03 2 views
0

Можно ли суммировать на cols, если внутреннее объединение истинно и сумма на других cols, если другое внутреннее соединение истинно? то естьМножественная сумма по разным cols в одном запросе

SELECT t1.debit 
    , t2.credit 
    , t1.ID 
    , t2.ID 
    FROM 
    (SELECT SUM(booking_value) debit 
      , gl_acct.id_fin_gl_acct ID 
     FROM bookings 
     JOIN gl_acct 
      ON (CONCAT('1',gl_acct.id_fin_gl_acct) = bookings.id_debit_account) 
    ) t1 
    JOIN 
    (SELECT SUM(booking_value) credit 
      , gl_acct.id_fin_gl_acct ID 
     FROM bookings 
     JOIN gl_acct 
      ON (CONCAT('1',gl_acct.id_fin_gl_acct)=bookings.id_credit_account) 
    ) t2 
    ON (t1.ID = t2.ID) 
GROUP 
    BY t1.ID 

Пожалуйста, объясните свой ответ.

+0

@ spencer7593 я хочу, чтобы получить сумму всех дебетовых и кредитных для каждого пользователя я смотреть этот [ответ] (http://stackoverflow.com/questions/20530617/multiple-sums-with-different-where -clauses-in-same-query-result-set), и я написал этот запрос, я опубликую его в другом комментарии –

+0

'SELECT t1.debit, t2.credit, t1.ID, t2.ID FROM ( SELECT sum (booking_value), как дебетовые, gl_acct.id_fin_gl_acct как ID от заказа INNER JOIN gl_acct на (CONCAT ('1', gl_acct.id_fin_gl_acct) = bookings.id_debit_account) ) t1 INNER JOIN ( SELECT SUM (booking_value) в качестве кредита, gl_acct. id_fin_gl_acct как идентификатор от заказов INNER JOIN g l_acct on (CONCAT ('1', gl_acct.id_fin_gl_acct) = bookings.id_credit_account) ) t2 ON (t1.ID = t2.ID) GROUP BY t1.ID' –

+0

Я думаю, что это выигрывает приз. – Strawberry

ответ

1

Пример условной агрегации.

SELECT t.id_account 
     , SUM(IF(t.cr_or_db='cr',t.tot_booking_value,0)) AS `tot_credit` 
     , SUM(IF(t.cr_or_db='db',t.tot_booking_value,0)) AS `tot_debit` 
    FROM ( 
      SELECT 'cr'     AS `cr_or_db` 
       , c.id_credit_account AS `id_account` 
       , SUM(c.booking_value) AS `tot_booking_value` 
      FROM bookings c 
      GROUP BY c.id_credit_account 
      UNION ALL 
      SELECT 'db'     AS `cr_or_db` 
       , d.id_debit_account AS `id_account` 
       , SUM(d.booking_value) AS `tot_booking_value` 
      FROM bookings d 
      GROUP BY d.id_debit_account 
     ) t 
    GROUP 
    BY t.id_account 

Вид рядный t получает нас общие кредиты для каждого id_credit_account и общего дебета для каждого id_debit_account.

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

Объединения операция будет требоваться только в том случае, если есть какая-то причина, по которой нам необходимо включить таблицу gl_acct. Предполагая, что id_fin_gl_acct UNIQUE в gl_acct ... мы могли бы добавить операцию соединения перед предложением GROUP BY.

... 
     ) t 

    JOIN gl_acct g 
    ON CONCAT('1',g.id_fin_gl_acct) = t.id_account 

    GROUP 
    BY t.id_account 
+0

Я делаю GROUP раньше, и это результат возврата, но это не то, что я хочу, потому что внутреннее соединение пропустит строки, которые не являются эквивалентными идентификаторами, спасибо за вашу помощь и объяснение;) –

+1

@ HussienAl-maani: Правильно. При операции JOIN вы возвращаете строки, где значение 'id_account' появляется с обеих сторон. Если идентификатор отсутствует с одной или другой стороны, строки будут исключены. Именно поэтому я думаю, что вы хотите получить «общий дебет» и «общий кредит» отдельно. Чтобы объединить их, мы можем использовать операцию UNION ALL. Чтобы получить результаты для каждого идентификатора в одной строке, мы можем ссылаться на объединенный набор как встроенное представление и использовать операцию GROUP BY и использовать условную агрегацию. – spencer7593

+0

вы даете мне хороший пример, объяснение и решение ,, ** спасибо ** снова за все –

Смежные вопросы