2016-09-14 3 views
-1

Ich habe eine Abfrage, die ich mehrmals für jeden Tag über einen Bereich ausgeführt werde. Ich möchte dies zu einer einzigen Abfrage reduzieren:MYSQL-Gruppe nach Intervall der Tage Summe jeden Tag

SELECT SUM(amount) AS all_time_revenue 
FROM charges WHERE DATE(`charges`.`created_at`) <= '2015-03-01' 

Ich bin in ein Problem laufen versucht, dies in einer einzigen Abfrage zu konvertieren - ich kann nicht GROUP BY „created_at“, weil ich alle Gebühren bin Erfassung vor und am Datum. (Nicht nur an diesem Datum). Ich bin mir nicht sicher, ob das möglich ist, aber ich bin sicher, wenn es hier ein Genie gibt, kann es das lösen. Hinweis: Es wäre auch schön, wenn ich die myDate sowie die Summe für jede Zeile zurückgeben könnte. Hier

ist ein komplettes Beispiel dafür, was ich tue:

$start_time = new DateTime('2016-08-01'); 
$end_time = new DateTime('2016-08-14'); 
$data = []; 
for ($start_time; $start_time < $end_time; $start_time = $start_time->modify('+1 day')) { 
    $date = $start_time->format("Y-m-d"); 

    $results = DB::SELECT("SELECT SUM(amount) AS all_time_revenue 
          FROM charges 
          WHERE `charges`.`created_at` <= ? AND `charges`.`sandbox`=0", 
          ", [$date]); 
    $data[$date] = $results[0]->all_time_revenue; 
} 

So ideal würde Ich mag eine einzelne Abfrage auszuführen, die mit einem Datumsbereich oder einem einzigen Datum und die Anzahl der Tage Intervall arbeiten können und ausspucken haben es Zeilen wie:

row 1: ['2016-08-01', 4000.00] 
row 2: ['2016-08-02', 4500.00] 
... 
row 14:['2016-08-14', 15000.00] 
+2

Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql- Abfrage – Strawberry

+0

Es ist nicht alles klar, was der Datentyp von 'created_at' ist ... ist das ein DATUM? ein DATETIME? Und welche Wertebereiche gibt es für $ mydate? – spencer7593

+0

Danke, weil ich keine Ahnung hatte, worüber sich @Strawberry beschwerte. –

Antwort

0

ich denke, die folgende Abfrage stellt dar, was Sie suchen. Es funktioniert auf einen Datumsbereich, wie Sie benötigt. Es ist eine einzelne Abfrage, die die kumulative Summe erzeugt (addiert sich zu dem im Datumsbereich angegebenen Anfangsdatum). Wenn Sie möchten, dass die Summierung ab der Epoche ausgeführt wird, könnte das auch getan werden.

create table tt (dt date, i integer); 

insert into tt values("2016-01-01",1); 

insert into tt values("2016-01-02",1); 
insert into tt values("2016-01-02",2); 

insert into tt values("2016-01-03",1); 
insert into tt values("2016-01-03",2); 
insert into tt values("2016-01-03",3); 

insert into tt values("2016-01-04",1); 
insert into tt values("2016-01-04",2); 
insert into tt values("2016-01-04",3); 
insert into tt values("2016-01-04",4); 

insert into tt values("2016-01-05",1); 
insert into tt values("2016-01-05",2); 
insert into tt values("2016-01-05",3); 
insert into tt values("2016-01-05",4); 
insert into tt values("2016-01-05",5); 

insert into tt values("2016-01-06",1); 
insert into tt values("2016-01-06",2); 
insert into tt values("2016-01-06",3); 
insert into tt values("2016-01-06",4); 
insert into tt values("2016-01-06",5); 
insert into tt values("2016-01-06",6); 

set @csum := 0; 
select date_format(dt,'%Y-%m-%d') dt,@csum:[email protected]+i as csum 
from (
    select dt,sum(i) as i 
    from tt 
    where dt between date('2016-01-02') and date('2016-01-05') 
    group by dt 
) as t1 
order by 1; 

|   dt | csum | 
|------------|------| 
| 2016-01-02 | 3 | 
| 2016-01-03 | 9 | 
| 2016-01-04 | 19 | 
| 2016-01-05 | 34 | 

Wenn Sie ab Epoche kumulativen Summen zu erhalten, ...

set @csum := 0; 
select date_format(dt,'%Y-%m-%d') dt,@csum:[email protected]+i as csum 
from (
    select dt,sum(i) as i 
    from tt 
    where dt<=date('2016-01-05') 
    group by dt 
) as t1 
where dt<=date('2016-01-05') and date('2016-01-05') 
order by 1; 

|   dt | csum | 
|------------|------| 
| 2016-01-01 | 1 | 
| 2016-01-02 | 4 | 
| 2016-01-03 | 10 | 
| 2016-01-04 | 20 | 
| 2016-01-05 | 35 | 
+0

Nochmals vielen Dank, aber ich glaube, es ist immer noch ein bisschen aus. Angesichts Ihrer Daten oben und des Datumsbereichs. 2016-01-03 -> 2016-01-05. Ich möchte die Beträge wie folgt zurückgeben: '['2016-01-03' => 10, '2016-01-04' => 20, '2016-01-05' => 35]' –

+0

Ich bin Ich denke, dass ich dies tun kann, indem ich es auf 2 Anfragen heruntergebrochen habe. Zum Beispiel für den Zeitraum von ** 2016-01-03 -> 2016-01-05 **: Der erste würde die Gesamtkosten am und vor dem ** 2016-01-03 ** erhalten. Die zweite würde Ihre kumulative Summenmethode für ** 2016-01-04 - 2016-01-05 ** verwenden und ein wenig PHP verwenden, um die korrekten Summen anzufügen. Dies wäre immer noch viel effizienter als das, was ich über große Zeiträume gemacht habe. –

+0

Wenn Sie Abhängigkeiten haben, die besser erfüllt werden könnten, indem Sie sie in zwei Abfragen aufteilen, ist das in Ordnung. Sie berechnen die Summe bis 2016-01-03 mit der ersten Abfrage; Verwenden Sie diesen Wert dann als Bootstrap zum Berechnen kumulativer Summen in der zweiten Abfrage. Ich denke, du bist auf dem richtigen Weg. – blackpen

Verwandte Themen