У меня есть запрос, который обеспечивает P&L вид моей структуры затрат на основе двух таблиц с данными о покупке.
Select Left(A.Location, 5) as Site, A.Account, A.Category, A.Sub_Category,
sum(If(Month(Inv.Invoice_Date)=1, A.Cost, 0)) as Jan,
sum(If(Month(Inv.Invoice_Date)=2, A.Cost, 0)) as Feb,
sum(If(Month(Inv.Invoice_Date)=3, A.Cost, 0)) as Mar,
sum(If(Month(Inv.Invoice_Date)=4, A.Cost, 0)) as Apr,
sum(If(Month(Inv.Invoice_Date)=5, A.Cost, 0)) as May,
sum(If(Month(Inv.Invoice_Date)=6, A.Cost, 0)) as Jun,
sum(If(Month(Inv.Invoice_Date)=7, A.Cost, 0)) as Jul,
sum(If(Month(Inv.Invoice_Date)=8, A.Cost, 0)) as Aug,
sum(If(Month(Inv.Invoice_Date)=9, A.Cost, 0)) as Sep,
sum(If(Month(Inv.Invoice_Date)=10, A.Cost, 0)) as Oct,
sum(If(Month(Inv.Invoice_Date)=11, A.Cost, 0)) as Nov,
sum(If(Month(Inv.Invoice_Date)=12, A.Cost, 0)) as Dece,
sum(Inv.Cost) as Total,
From Table.A as A
Left join (Select Invoice_Number, Invoice_Line_Number, Invoice_Date, group by Invoice_Number, Invoice_Line_Number) as Inv
on Inv.Invoice_Number = A.Invoice_Number and Inv.Invoice_Line_Number = A.Invoice_Line_Number
Where Left(A.Location_Desc, 5) = 'TEX01'
and Year(Inv.Invoice_Date) = '2016'
Group by Site, Account, Category, Sub_Category
Having Total <> 0
;
Все идет нормально. Теперь мне нужно сделать три вещи, с которыми я боролся:
1) Мне нужно иметь строку «Общая стоимость за месяц» внизу столбца каждого месяца — возможно ли это?
2) Мне нужно добавить переменные строки, которые я могу изменить перед выполнением запроса. Например, если я найду инвестиционную возможность уменьшить стоимость на сумму Х, я хотел бы иметь возможность ввести строку, которая вычитает эту сумму из общей суммы затрат, чтобы показать экономию.
3) Мне нужно рассчитать NPV инвестиций в экономию средств. Это раскрывает еще одну проблему. Запрос структурирован только для получения данных за 1 год, но для расчетов NPV требуются прогнозы, охватывающие от 5 до 10 лет.
Оптимальный запрос усреднит стоимость сайта и спроецирует будущую стоимость с этим средним значением — тогда он будет вводить переменные строки, которые уменьшают стоимость за счет новых инвестиций, и, наконец, выполнит вычисление NPV, чтобы определить, стоит ли инвестировать. ,
Мои вопросы:
а) Является ли MySQL подходящим инструментом для этого?
б) Я знаю, что из простого оператора select это невозможно — оператор просмотра здесь не будет работать, потому что у меня есть подзапрос в операторе Select. Должен ли я создать новую таблицу, содержащую выходные данные запроса в качестве данных, и использовать эту таблицу для выполнения всего этого?
в) Должен ли я искать решение для языка программирования / MySQL?
Спасибо!!
По первому пункту вы можете получить результат с помощью запроса ниже
Select Left(A.Location, 5) as Site, A.Account, A.Category, A.Sub_Category,
sum(If(Month(Inv.Invoice_Date)=1, A.Cost, 0)) as Jan,
sum(If(Month(Inv.Invoice_Date)=2, A.Cost, 0)) as Feb,
sum(If(Month(Inv.Invoice_Date)=3, A.Cost, 0)) as Mar,
sum(If(Month(Inv.Invoice_Date)=4, A.Cost, 0)) as Apr,
sum(If(Month(Inv.Invoice_Date)=5, A.Cost, 0)) as May,
sum(If(Month(Inv.Invoice_Date)=6, A.Cost, 0)) as Jun,
sum(If(Month(Inv.Invoice_Date)=7, A.Cost, 0)) as Jul,
sum(If(Month(Inv.Invoice_Date)=8, A.Cost, 0)) as Aug,
sum(If(Month(Inv.Invoice_Date)=9, A.Cost, 0)) as Sep,
sum(If(Month(Inv.Invoice_Date)=10, A.Cost, 0)) as Oct,
sum(If(Month(Inv.Invoice_Date)=11, A.Cost, 0)) as Nov,
sum(If(Month(Inv.Invoice_Date)=12, A.Cost, 0)) as Dece,
sum(Inv.Cost) as Total,
From Table.A as A
Left join (Select Invoice_Number, Invoice_Line_Number, Invoice_Date, group by Invoice_Number, Invoice_Line_Number) as Inv
on Inv.Invoice_Number = A.Invoice_Number and Inv.Invoice_Line_Number = A.Invoice_Line_Number
Where Left(A.Location_Desc, 5) = 'TEX01'
and Year(Inv.Invoice_Date) = '2016'
Group by A.Site, A.Account, A.Category, A.Sub_Category with ROLLUP Having Total <> 0 AND
((a.Site is null or A.Account is not null) and (A.Account is null or A.Category is not null) and (A.Category is null or A.Sub_Category is not null));
Других решений пока нет …