2012-11-14 2 views
0

я несколько записей сохраняются следующим образом:SQL Период между двумя датами, запрос на каждый день среднемировой

ID | StartDate | Enddate | Amount 

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

Например

1 | 2012-01-01 | 2012-01-05 | 10 
2 | 2012-01-04 | 2012-01-05 | 20 

должен стать

2012-01-01 | 2 
2012-01-02 | 2 
2012-01-03 | 2 
2012-01-04 | 12 
2012-01-05 | 12 

Возможно ли это? Я не могу представить, как заключить из периода в значения одного дня. Заранее спасибо!

+1

Какую базу данных и версию вы используете? –

+0

Я запускаю базу данных MySQL «mysqlnd 5.0.8-dev - 20102224 - $ Revision: 310735 $». Я был бы рад общему ответу, хотя, поэтому я могу представить, как это «разделение» парода могло бы работать. Благодаря! – thoughtgap

ответ

1

Если вам нужен результат запроса со всеми датами, необходимо иметь таблицу дат (little help). Я даю вам ответ и не использую таблицу даты.

SQLFIDDLEExample 1 with Date Table

Запрос:

SELECT 
DATE_FORMAT(td.TimeKey, '%Y-%m-%d') as Date, 
SUM(Amount/(SELECT COUNT(tdc.TimeKey) 
     FROM Table1 t1c, TDate tdc 
     WHERE t1c.StartDate<= tdc.TimeKey 
      AND t1c.Enddate >= tdc.TimeKey 
      AND t1c.ID = t1.ID)) as Total_Amount 
FROM Table1 t1, TDate td 
WHERE t1.StartDate<= td.TimeKey 
    AND t1.Enddate >= td.TimeKey 
GROUP BY Date 
ORDER BY Date 

Результат:

|  DATE | TOTAL_AMOUNT | 
----------------------------- 
| 2012-01-01 |   2 | 
| 2012-01-02 |   2 | 
| 2012-01-03 |   2 | 
| 2012-01-04 |   12 | 
| 2012-01-05 |   12 | 

И тот же результат без использования даты таблицы:

SQLFIddle example just with SQL (without Date table)

+0

Это выглядит потрясающе, спасибо! – thoughtgap

0

Вы можете использовать таблицу целых чисел для создания диапазонов дат. См. Мой ответ here за то, что я говорю.

В вашем случае вы определяете количество дней в каждом диапазоне дат и используете это для максимального числа. Это максимальное число было бы ограничено количеством строк до соответствующего количества дней и для вычисления среднего значения для каждого дня в диапазоне дат.

+0

Благодарим вас за это предложение. Я рассмотрю ваше решение позже, но я боюсь, что не могу изменить структуру db-таблицы. Возможно, мне придется делать эти вычисления в php и запускать несколько запросов (по одному в день). – thoughtgap

+0

@thoughtgap: вам не нужно менять структуру таблицы. Вам просто нужно добавить одну таблицу столбцов, называемую 'numbers'. Если это невозможно, вы можете даже положить 'nums' в другой db, а затем присоединиться к нему, как это' FROM mytable JOIN otherdb.nums' – dnagirl

+0

О, я получил ваше мнение. Спасибо за это предложение, я обязательно попробую это позже для учебных целей. Для мгновенного успеха я предпочитаю решение ниже. Хорошего дня! – thoughtgap