2015-02-04 2 views
0

Я пытаюсь отобразить в таблице (с плагинами таблиц данных) информацию с суммой из 3 таблиц, используя Left Join в sql-запросе. мне удалось изменить на стороне сервера запрос и отображать корректные ДАННЫЕ с первой между двумя назначать вдовью часть таблицы (t1 = ... Бюджет & t2 = .. budget_changes) с помощью следующего запроса:Несколько левых Присоединиться к сумме

$year=date('Y'); 

$sQuery = "SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns)).", 

IFNULL(SUM(t2.change_amount),0) AS operation_changes, 
(t1.operation_BP+IFNULL(SUM(t2.change_amount),0)) AS operation_total 
FROM budget AS t1 

LEFT JOIN wp_dri_budget_changes AS t2 ON t2.change_year_operation=t1.operation_year_number 

WHERE t1.operation_year=".$year." AND t1.operation_active=1 $sWhere 

GROUP BY operation_year_number, change_year_operation $sOrder $sLimit"; 

Но когда я пытаясь соединить 3 таблицы с левым совместным запросом, сумма результатов неверна.

$year=date('Y'); 

$sQuery = "SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns)).", 

IFNULL(SUM(t2.change_amount),0) AS operation_changes, 

(t1.operation_BP+IFNULL(SUM(t2.change_amount),0)) AS operation_total, 

IFNULL(SUM(t3.expense_enga_amount),0) AS operation_consommation 

FROM budget AS t1 

LEFT JOIN wp_dri_budget_changes AS t2 ON t2.change_year_operation=t1.operation_year_number 

LEFT JOIN wp_dri_budget_expenses AS t3 ON t3.expense_year_operation=t1.operation_year_number 

WHERE t1.operation_year=".$year." AND t1.operation_active=1 $sWhere GROUP BY operation_year_number, change_year_operation, expense_year_operation $sOrder $sLimit"; 

Что случилось с этим вопросом? Many Thanks MT

+1

Опубликуйте некоторые исходные данные и ожидаемый результат. – axiac

+0

показать нам структуру таблиц – Alex

ответ

0

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

ТАКЖЕ Я ЗНАЮ Я сократил столбцы и псевдонимы для упрощенного чтения и понимания концепции того, с чем вы, вероятно, сталкиваетесь.

Select 
     t1.yr, 
     sum(t2.Amt) as AmtChange 
    FROM 
     budget AS t1 
     LEFT JOIN Budget_Changes AS t2 
      on t1.yr = t2.Yr 

В конце концов, нет проблем ... для данного года, вы получите итоговую из второй таблицы. Есть много записей в таблице 2. Пример: Данные

Budget 
Yr 
2013 
2014 

Budget_Changes 
Yr Amt 
2013 10 
2013 20 
2013 30 
2014 40 
2014 50 

Your results would be 
Yr AmtChange 
2013 60 
2014 90 

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

Change_Orders 
Yr  COAmt 
2013 100 
2013 120 
2014 200 
2014 220 

И вы добавить это в качестве вторичного левого присоединиться к вашему запросу, что-то вроде

Select 
     t1.yr, 
     sum(t2.Amt) as AmtChange, 
     sum(t3.COAmt) as COAmtChange 
    FROM 
     budget AS t1 
     LEFT JOIN Budget_Changes AS t2 
      on t1.yr = t2.Yr 
     LEFT JOIN Change_Orders AS t3 
      on t1.yr = t3.Yr 


Your might expect the results to be 
Yr AmtChange COChangeAmt 
2013 60   220 
2014 90   420 

Однако, так как это декартово результат ... несколько строк на каждое объединение принимает результаты TIM ES каждая запись, которая существует в другой таблице ... что-то вроде

Yr AmtChange COChangeAmt 
2013 120   440 
2014 180   840 

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

Select 
     t1.yr, 
     t2.AmtChange, 
     t3.COAmtChange 
    FROM 
     budget AS t1 
     LEFT JOIN (select BC.Yr, sum(BC.Amt) as AmtChange 
         from Budget_Changes BC 
         group by BC.Yr) t2 
      on t1.yr = t2.Yr 
     LEFT JOIN (select CO.Yr, sum(CO.COAmt) as COAmtChange 
         from Change_Orders CO 
         group by CO.Yr) AS t3 
      on t1.yr = t3.Yr 

Таким образом, подзапросы будут каждый возвращать только 1 запись на соответствующий год быть агрегируется и тем самым предотвратить дубликат в сумме() сумма.

+0

Спасибо за помощь. DRapp !!!
и спасибо аксиак и Ким Александр, который предложил мне помочь. – maxenceT

+0

@maxenceT, рад помочь, и надеюсь, что основа этого могла помочь вам решить проблему. Кроме того, как новичок (и мы все были там), проверьте ссылку для HELP -> TOUR для этикета сайта. – DRapp

0

Это окончательное и, похоже, работает.

$year=date('Y'); 
$sQuery = "SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns)).", 
t2.total_changes, 
t1.operation_BP+IFNULL(total_changes,0) AS operation_total, 
t3.total_conso 
FROM $sTable AS t1 
LEFT JOIN (SELECT tt2.change_year_operation, IFNULL(SUM(tt2.change_amount),0) AS total_changes FROM wp_dri_budget_changes tt2 GROUP BY tt2.change_year_operation) t2 ON t1.operation_year_number = t2.change_year_operation 
LEFT JOIN (SELECT tt3.expense_year_operation, IFNULL(SUM(tt3.expense_enga_amount),0) AS total_conso FROM wp_dri_budget_expenses tt3 GROUP BY tt3.expense_year_operation) AS t3 ON t1.operation_year_number = t3.expense_year_operation 
WHERE t1.operation_year=".$year." AND t1.operation_active=1 $sWhere $sOrder $sLimit"; 

OPERATION_NUMBER ИМЯ BP ИЗМЕНЕНИЯ TOTAL TOTAL_CONSO


15P731OV001 project1 28000 (нуль) 28000 (нуль)

13P0012OV001 project2 612500 -60000 552500 21000

** Но теперь IFNULL (x, 0), похоже, больше не работает и null (NaN.N в данных) отображаются, когда сумма результатов равна NULL **

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