2016-09-14 3 views
-1

나는 범위에 걸쳐 매일 여러 번 실행중인 쿼리가 있습니다. 나는 하나의 쿼리에이 감소하고 싶습니다 :간격으로 일별 간격으로 MYSQL 그룹

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

내가 단일 쿼리에이 변환하려고 문제로 실행 해요 - 내가 GROUP BY "created_at"나는 전에 모든 요금 을 캡처하고 할 수 없기 때문에 및 날짜. (단지 그 날짜에). 이것이 가능한지 확실하지 않지만, 해결할 수있는 천재성이 있다면 여기에 확신 할 수 있습니다. 참고 : 각 행에 대해 myDate의 합계을 반환 할 수 있으면 좋을 것입니다. 내가 날짜 범위 또는 일 간격의 하나의 날짜와 번호와 함께 작동 할 수있는 단일 쿼리를 실행하고 싶습니다 그래서 이상적으로

$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; 
} 

: 여기

내가 뭘하는지의 완벽한 예입니다

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

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

+0

'created_at'의 데이터 유형이 ... DATE입니까? DATETIME? $ mydate에 어떤 값의 범위가 제공됩니까? – spencer7593

+0

감사합니다. 왜냐하면 @Strawberry가 무엇에 대해 불평하고 있는지 전혀 몰랐기 때문입니다. –

답변

0

내가 다음 쿼리은 당신이 찾고있는 것을 나타냅니다 생각 :이 같은 행을 뱉어 있습니다. 필요할 때 날짜 범위 에서 작동합니다. 누적 합계를 생성하는 단일 쿼리입니다 (날짜 범위의 시작 날짜부터 합계). 당신이 합계가 신기원부터 시작되기를 원한다면, 그것은 또한 행해질 수 있습니다.

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

는 누적 합계는, 시대부터 얻고 싶은 경우에

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; 

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<=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

다시 한 번 감사드립니다. 그러나 나는 아직 조금 벗어난 것으로 믿습니다. 위의 데이터와 날짜 범위를 감안할 때 2016-01-03 -> 2016-01-05 '[ '2016-01-03'=> 10, '2016-01-04'=> 20, '2016-01-05'=> 35]' –

+0

저는 다음과 같이 합계를 반환하고 싶습니다. 2 쿼리로 나누면됩니다. 예를 들어 ** 2016-01-03 -> 2016-01-05 **의 기간 : ** 처음에는 ** 2016-01-03 ** 이전에 총 청구액이 발생합니다. 두 번째 방법은 ** 2016-01-04 - 2016-01-05 **에 누적 합계 기법을 사용하고 약간의 PHP를 사용하여 올바른 합계를 추가합니다. 이것은 여전히 ​​큰 날짜 범위에 걸쳐 수행하는 것보다 훨씬 더 효율적입니다. –

+0

두 개의 쿼리로 분리하여 더 잘 만족할 수있는 종속성이 있다면 괜찮습니다. 첫 번째 쿼리를 사용하여 2016-01-03까지 합계를 계산합니다. 그 값을 부트 스트랩으로 사용하여 두 번째 쿼리에서 누적 합계를 계산하십시오. 나는 네가 올바른 방향으로 가고 있다고 생각한다. – blackpen

관련 문제