2017-01-17 4 views
0

Как вы группируете по нескольким условиям на агрегированную функцию sql. Например у меня есть две таблицы Sales и AccountsНесколько условий на sql Агрегатная функция

Sales

ID | identifier_one | identifier_two | quantity | date 
1 |  1   |  A1   | 1  | 2017-01-01 
2 |  1   |  B1   | 1  | 2017-01-01 
3 |  1   |  A1   | 1  | 2017-01-02 

запрос должен заполнить таблицу счетов, как так

Accounts

ID | identifier_one | identifier_two | current_month | current_year 
1 |  1   |  A1   | 2   |  2 
2 |  1   |  B1   | 1   |  1 

Я имел этот запрос, но это займет на счете identifier_one, поэтому в этом примере обе записи в учетной записи s будет иметь 3 и 3

$sales = DB::select('SELECT 
          identifier_one, 
          SUM(IF(YEAR(`date`) = YEAR(CURDATE()), quantity, 0)) AS current_year, 
          SUM(IF(YEAR(`date`) = YEAR(CURDATE()) AND MONTH(`date`) = MONTH(CURDATE()), quantity, 0)) AS current_month, 
          SUM(IF(YEAR(`date`) = YEAR(CURDATE()) - 1, quantity, 0)) AS last_year, 
          SUM(IF(YEAR(`date`) = YEAR(CURDATE()) AND MONTH(`date`) = MONTH(CURDATE()) - 1, quantity, 0)) AS last_month 
         FROM sales 
         GROUP BY identifier_one'); 

foreach ($sales as $sale) { 

        DB::table('accounts') 
         ->where([ 
          ['identifier_one', '=', $sale->identifier_one] 
         ]) 
         ->update([ 
          'current_year' => $sale->current_year, 
          'current_month' => $sale->current_month, 
          'last_month' => $sale->last_month, 
          'last_year'  => $sale->last_year 
         ]); 


       } 
+0

Может быть, я что-то отсутствует, но только через запятую и имя поля Int а групповую .... 'GROUP BY identifier_one, identifier_two' и если вы хотите добавить identifier_two в избранных. – xQbert

ответ

0

Похоже вам просто нужно добавить, и имя поля в группе по. Возможно, вы захотите добавить identifier_two в select, а также в случае, если предложение where должно быть обновлено для учета обоих идентификаторов. (Скорее всего)

SELECT identifier_one 
    , identifier_two --not required but may be useful as you seem to filter on identifier_one later; maybe you also need the 2nd one... 
    , SUM(IF(YEAR(`date`) = YEAR(CURDATE()), quantity, 0)) AS current_year, 
    , SUM(IF(YEAR(`date`) = YEAR(CURDATE()) AND MONTH(`date`) = MONTH(CURDATE()), quantity, 0)) AS current_month 
    , SUM(IF(YEAR(`date`) = YEAR(CURDATE()) - 1, quantity, 0)) AS last_year 
    , SUM(IF(YEAR(`date`) = YEAR(CURDATE()) AND MONTH(`date`) = MONTH(CURDATE()) - 1, quantity, 0)) AS last_month 
FROM sales 
GROUP BY identifier_one, identifier_two --this is what you're missing 
+0

Я собирался сказать, что при обновлении я должен добавить в 'where()' clause '['identifier_two', '=', $ sale-> identifier_two]' – Packy

+0

, но все это, похоже, все 3 одинаково – Packy

+0

Я не понимаю, как это возможно. «GROUP BY identifier_one, identifier_two» гарантирует, что сумма рассчитана для каждого уникального спаривания идентификатора_идентификатора и идентификатора_two. в этом случае вы должны получить только две строки, возвращенные – xQbert

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