2013-06-04 4 views
1

У меня есть таблица базы данных, содержащая данные проекта с одной записью для каждого проекта. Ниже некоторых выборочных данных продолжительность составляет несколько месяцев и в настоящее время ограничена макс. 240, но может, теоретически, быть бесконечным:Вернуть несколько строк на основе значения int из одной записи

id name  amount start_date duration 
1 Project A 9.000 2013-06-24 3 
2 Project B 5.000 2013-07-13 2 
3 Project C 15.000 2013-08-06 3 

Теперь я хочу MySQL, чтобы вернуть сумму в месяц для каждого проекта:. Объем, деленное на продолжительность каждого месяца, начиная с месяца start_date находится в Так на основе приведенные выше данные, MySQL будет возвращать что-то, как показано ниже, упорядоченный по месяцам:

id name  month amount_this_month 
1 Project A 2013-06 3.000 
1 Project A 2013-07 3.000 
2 Project B 2013-07 2.500 
1 Project A 2013-08 3.000 
2 Project B 2013-08 2.500 
3 Project C 2013-08 5.000 
3 Project C 2013-09 5.000 
3 Project C 2013-10 5.000 

я увидел что-то here для SQL Server, давая предложение использовать фиктивную таблицу, заполненные числа. У кого-нибудь есть идеи о том, как это сделать, не влияя на исходную структуру базы данных?

Мне нужно сделать это в одном запросе (поэтому нет таблиц temp (mem)). Как это возможно в MySQL? Я видел некоторые решения для Oracle для итерации через (виртуальный) диапазон/последовательность, можно ли сделать что-то подобное в MySQL?

+0

Q: Почему я хочу сделать это в одном запрос, нет таблиц temp/mem? A: Мне нужно добавить это как часть одного SQL-запроса, который будет динамически генерироваться закрытым исходным модулем в системе, в которой я сейчас экспериментирую/тестирую. – 7ochem

+0

Это можно сделать с MySQL. Я был бы более склонен помочь, если бы вы показали мне, что вы пробовали до сих пор, и почему это не удалось. – RandomSeed

+1

Таблица целых чисел - это самый простой способ сделать это, и это полезно для других вещей. Однако вы можете иметь подзаголовок фиксированных значений, объединенных вместе, чтобы получить диапазон чисел, и присоединить их к себе, чтобы получить большие диапазоны. Что-то вроде (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) – Kickstart

ответ

1

Вы можете сделать что-то вроде этого, вступив фиктивный диапазон чисел от себя, чтобы получить диапазон чисел, а затем добавить, что базовый месяц

SELECT id, name, DATE_FORMAT(DATE_ADD(start_date, INTERVAL Units.i + Tens.i * 10 + Hundreds.i * 100 MONTH), '%Y-%m') AS `month`, (amount/duration) AS `amount_this_month` 
FROM SomeTable 
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Units 
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Tens 
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) Hundreds 
WHERE (Units.i + Tens.i * 10 + Hundreds.i * 100) < duration 
+0

Ничего себе, не думал о присоединении к фиксированным номерам. Отличное решение, попробуем прямо ... – 7ochem

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