2015-04-30 1 views
0

Я пытаюсь создать отчет о доходах из таблиц, используемых нашей древней системой ERP. У меня есть одна таблица, содержащая суммы и формулы. Мне нужно, чтобы принять эти формулы и вычисления суммы, но я не уверен, что лучший способ сделать это:Необходимо проанализировать столбец, вывести опорные значения и выполнить математические операции с использованием TSQL

RowID | Description     | Amount 
470 | Gross Furniture Revenue  | 324654  
471 | Less:Medals & Specials  | -12345 
472 | Adjusted Gross Furn.Revenue | r0470+r0471 

Формулы не всегда будет добавка. Некоторые из них «r2210/2» или «r670-r700-r710». Как я могу рассчитать их с помощью tsql, чтобы у меня была одна чистая таблица значений, которая будет передана в мой отчет?

+0

Это ... очень странный способ получить данные он выглядит так, как будто вам нужно выполнить динамический запрос. – SLin

+0

Я знаю, это ужасно. Любые идеи о том, как я буду это делать? – april4181

+0

Что означает r0470? вы отбросили бы r? – 1010

ответ

1

Я бы не стал писать парсер в SQL, даже если это возможно, для такого материала есть гораздо лучшие языки. Я бы хотел:

посмотреть таблицу - суммы хранятся в словаре - для каждой формулы, tokenize формулу и положить ее в стек. В вашем примере

lookup(0470) 
    lookup(0471) 
    op "+" 

оценивать выражения, пока стек не содержит один элемент (результат формулы) и положить, что в таблице поиска и т.д.

0

- http://stackoverflow.com/questions/18881913/replace-occurrences-of-a-list-of-strings-in-a-string-without-a-cursor-in-t-sql

- Кодекс принимает ваше исходное определение отчета указателя строки, затем замените ссылочные указатели на формулы, сформируйте план выполнения линии

-- ORIGINAL REPORT FORMULATIONS 
DECLARE @REPORT AS TABLE (RowID BIGINT,[Description] VARCHAR(MAX),Amount VARCHAR(MAX)); 

-- RABLE FROM THE OUTPUTED FINAL REPORT 
DECLARE @FinalReport AS TABLE (RowID BIGINT,[Description] VARCHAR(MAX),Amount VARCHAR(MAX)); 

-- TABLE TO STORE CONVERSTION CROSS REVERANCE IN 
DECLARE @DO TABLE (REF VARCHAR(MAX),[ACTION] VARCHAR(MAX));  

DECLARE 
@RID BIGINT,            --- REPORT POINTER TO READ FROM CURSOR 
@DESC VARCHAR(MAX),           --- REPORT DESCRIPTION TO READ FROM CURSOR 
@FORMULA VARCHAR(MAX),          --- FORMULA FOR REPORT DEFINITION 
@SQL NVARCHAR(MAX),           --- SQL TO PASS TO SP_EXECUTESQL 
@PRAMS NVARCHAR(MAX) = '@RETURN AS DECIMAL(18,10) OUTPUT', --- PRAMAS USED IN SP_EXECUTESQL 
@RETURNED DECIMAL(18,10)         --- VALUE RETURNED FROM SP_EXECUTESQL 

-- LOAD UP REPORT EXAMPLES  
INSERT INTO @REPORT (RowID,[Description],Amount) VALUES 
(470,'Gross Furniture Revenue','10000'), 
(471,'Less:Medals & Specials','-7500'), 
(472,'Adjusted Gross Furn.Revenue','R0470+R0471'), 
(473,'1/2 X SUBTOTAL','R0472/2'), 
(474,'ADD SOME VALUE','283.45'), 
(475,'TOTAL','R0473+R0474'); 

-- CREATE CROSS REF TABLE DATA 
INSERT INTO @DO (REF,[ACTION]) 
SELECT RTRIM(LTRIM('R' + RIGHT('000000' + CAST(RowID AS VARCHAR(10)),4))) AS REF ,RTRIM(LTRIM(Amount)) AS [ACTION] FROM @REPORT; 

-- LOOP THROUGH REPORT DEFINITION FILE TO GENERATE FINAL REPORT 
DECLARE BUILDREPORT CURSOR FOR SELECT RowID,[Description],Amount FROM @REPORT; 

OPEN BUILDREPORT; 

FETCH NEXT FROM BUILDREPORT INTO @RID, @DESC, @FORMULA; 

WHILE @@FETCH_STATUS = 0 
BEGIN 

-- NOTE, BESURE TO WRAP THE SUBSTITUTED FORMULAS IN BRACKETS TO INSURE CORRECT CALCULATIONS 
    SELECT @FORMULA = REPLACE(@FORMULA, REF, '(' + [ACTION] + ')') FROM @DO ORDER BY REF DESC; 

-- REPLACE REF WITH VALUES 
    SET @SQL = N'SELECT @RETURN = CAST((' + @FORMULA + N') AS DECIMAL(18,10)) ' 

-- PROCESS CALCULATIONS 
    EXEC SP_EXECUTESQL @SQL , @PRAMS, @RETURN = @RETURNED OUTPUT 

-- OUTPUT REPORT 
    INSERT INTO @FinalReport(RowID,[Description],Amount) VALUES(@RID, @DESC,@RETURNED); 

    FETCH NEXT FROM BUILDREPORT INTO @RID, @DESC, @FORMULA; 
END; 

CLOSE BUILDREPORT; 

DEALLOCATE BUILDREPORT; 

-- SHOW REPORT 
SELECT * FROM @FinalReport 
+0

, пожалуйста, отредактируйте свой ответ, чтобы включить текст комментария в верхней части вашего ответа, а затем удалите свой комментарий, это принесет пользу будущим читателям SO, поместив всю необходимую информацию в соответствующее, ожидаемое место. – mickmackusa

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