2015-12-20 2 views
0

У меня есть таблица MySQL называется «запись» с этой структурой: docdate, дб, кр, всехкак MySQL объединить два отдельные результаты запроса из одной таблицы

и два запроса, как:

1. SELECT docdate, SUM(total) as ins FROM records where db='somefilter' AND 'someotherfilters' GROUP BY docdate 
2. SELECT docdate, SUM(total) as outs FROM records where cr='somefilter' GROUP BY docdate 

То, что я хочу для того чтобы достигнуть в одном SQL заявление является результатом как:

docdate   ins  outs 
2015-12-15  NULL 1200.00 
2015-12-16 1000.00  NULL 
2015-12-17 2500.00 2000.00 

Любая идея будет высоко оценена. Tnx

+0

сделать полный OUTER JOIN двух таблиц на него docdate. – Renzo

+0

Насколько я знаю, FULL OUTER JOIN не поддерживается в MySQL. @Renzo – Trent

+0

tnx @AlexJolig для улучшения форматирования. Совершенно новый для stackoverflow и не знал, как правильно это сделать. :) – sorinr

ответ

1

Если вы не возражаете, чтобы иметь 0 вместо NULL, вы можете положить IF внутри SUM, как это:

SELECT 
    docdate, 
    SUM(IF(db='somefilter' AND 'someotherfilters', total, 0)) as ins, 
    SUM(IF(cr='somefilter', total, 0)) as outs 
FROM records 
GROUP BY docdate 

Edit:

Если вы действительно хотите иметь NULL значения, вы можете обернуть SUM в NULLIF заявлении

... NULLIF(SUM(...), 0) AS ... 
+0

в моем случае «somefilter» имеет одинаковое значение в обоих SQL-запросах @Thomas Ghesquiere – sorinr

+0

Протестировано и это решение, и оно работает как шарм. Будьте осторожны и просто добавьте ')' before 'как ins или as outs, чтобы закрыть функцию SUM. Спасибо @Thomas Ghesquiere – sorinr

+0

Действительно, исправил. –

0

Мне нравится SUMIF ответ - вот еще один способ, чтобы получить тот же результат (но с нулевыми возвращается в соответствии с просьбой)

Имейте в виду, оба эти подхода имеют ужасающие проблемы с производительностью, если таблица записей большой (как и требуют последовательного сканирования. Вот SQL-скрипку http://sqlfiddle.com/#!9/b066c/1

SELECT 
    docdate, 
    (
    SELECT SUM(total) FROM records r2 WHERE r2.docdate = records.docdate AND r2.field1 = 'Live' 
) as ins, 
    (
    SELECT SUM(total) FROM records r3 WHERE r3.docdate = records.docdate AND r3.field1 = 'Test' AND r3.field2 = 'OK' 
) as outs 
FROM 
    records 
GROUP BY 1 
+0

с некоторыми небольшими изменениями в предложении WHERE это решение приносит результаты, которые мне нужны. Tnx @Trent – sorinr

0

Один из способов сделать это можно использовать использовать UNION, см http://dev.mysql.com/doc/refman/5.7/en/union.html

SELECT docdate, SUM(ins) as ins , SUM(outs) as outs 
FROM 
(
    (
    SELECT docdate, SUM(total) as ins , null as outs 
    FROM records 
    where db='somefilter' AND 'someotherfilters' 
    GROUP BY docdate 
    ) 
    UNION 
    (
    SELECT docdate, null as ins, SUM(total) as outs 
    FROM records 
    where cr='somefilter' GROUP BY docdate 
    ) 
) AS t 
GROUP BY docdate; 
+0

Я предполагаю, что это потерпит неудачу, потому что вам нужно группировать все неагрегатные столбцы. В первом SELECT есть две неагрегатные позиции 1 и 3, но в союзных позициях 1 и 2 являются неагрегатами. – Trent

+0

Я думаю, что в mssql это не сработает, но в mysql это должно работать просто отлично – David

+0

этот союз фактически создает строки из первого запроса sql, после чего добавляет результаты второго querry. Мне просто нужно найти способ сопоставить оба результата с помощью docdate. @Trent – sorinr

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