2017-12-03 4 views
1

Ich habe eine Funktion, die die Anzahl der Verkäufe jeden Tag zurückgibt. Das Problem bei diesem Ansatz ist, dass ich die Daten nach dem Datum gespeichert werden soll, aber ich bin sie in dem folgenden Auftrag:Rückgabedaten nach Datum sortiert

01-Dec 
02-Dec 
03-Dec 
03-Nov 
04-Nov 
05-Nov 
etc. 

Ich verstehe, warum das passiert, aber ich bin nicht sicher, wie es zu lösen. Ich kann subMonth (1) durch startofmonth ersetzen, die mein Problem teilweise lösen würden, aber das ist nicht, was ich will. Ich möchte stattdessen die letzten 30 Tage zurückgeben.

return DB::table('sales') 
     ->select(\DB::RAW('DATE_FORMAT(created_at, "%d-%M") as date'), \DB::raw('COUNT(*) as count')) 
     ->where('created_at', '>=', Carbon::now()->subMonth(1)) 
     ->orderBy('date') 
     ->groupBy('date') 
     ->get(['date', 'count']) 
     ->keyBy('date') 
     ->transform(function ($data) { 
      return $data->count; 
     }); 

Ich habe auch versucht orderBy (‚created_at‘), aber es gibt mir den Fehler unten und ich würde den SQL-Modus zu vermeiden, wie das Ändern.

Syntax error or access violation: 1055 Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'x.sales.created_at' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 

EDIT: Wie gewünscht, das ist die SQL-Abfrage der return-Anweisung

select DATE_FORMAT(created_at, "%d-%M") as date, COUNT(*) as count from `sales` where `created_at` >= ? group by `date` order by `date` asc 
+0

Bitte senden Sie generierten SQL – lad2025

+0

@ lad2025 Ich habe gerade :) – George

+0

Bitte versuchen Sie es: '-> groupBy ('1')' statt '-> groupBy ('date')' – lad2025

Antwort

0

Ich habe nicht viel Ahnung von Ihren Rahmen Abfragesyntax. Sie können jedoch eine weitere Spalte DATE_FORMAT (created_at, "% Y% m% d") als Auftragsspalte und Auftrag anwenden und nach Spalte "Auftragsspalte" gruppieren und die Spalte "data" verwenden, während die Daten angezeigt werden.

select DATE_FORMAT(created_at, "%Y%m%d") AS order_column, DATE_FORMAT(created_at, "%d-%M") as date, COUNT(*) as count from `sales` where `created_at` >= ? group by `order_column` order by `order_column` asc 



return DB::table('sales') 
     ->select(\DB::RAW('DATE_FORMAT(created_at, "%Y%m%d") AS order_column'),\DB::RAW('DATE_FORMAT(created_at, "%d-%M") as date'), \DB::raw('COUNT(*) as count')) 
     ->where('created_at', '>=', Carbon::now()->subMonth(1)) 
     ->orderBy('order_column') 
     ->groupBy('order_column') 
     ->get(['date', 'count']) 
     ->keyBy('date') 
     ->transform(function ($data) { 
      return $data->count; 
     }); 
+0

Yeap, das ist das gleiche wie die rohen 'created_at' Werte zu erhalten. Ich könnte nur nach der rohen created_at sortieren, aber ich bekomme den Fehler, den ich oben erwähnt habe (sql_mode = only_full_group_by) mit beiden Fällen. Ich nehme an, ich muss die mysql-Einstellung ändern, um damit fertig zu werden ... – George

0

Wenn Sie dies in 2 Schritten machen, funktioniert es?

Schritt 1 erstellen, in dem Sie Datumsspalte:

$step1 = DB::table('sales') ->select(\DB::RAW('DATE_FORMAT(created_at, "%d-%M") as date'))) 
->where('created_at', '>=', Carbon::now()->subMonth(1)) 
->orderBy('date') 
->get(['date', 'count']) 

und danach machen Sie die agregation:

$step2 = $step1->select('date'), \DB::raw('COUNT(date) as count')) 
->groupBy('date') ->get(['date', 'count']) ->keyBy('date') 

Hoffe, es hilft!

Verwandte Themen