Text 基于另一个表中的值计算文本表达式

Text 基于另一个表中的值计算文本表达式,text,expression,Text,Expression,我有两张桌子: Tbl1: Tbl2: 是否可以使用Tbl1中特定日期的相应值计算Tbl2中的表达式 例如:2017年2月27日 SC-1a/SC-1b将评估为883/1025=0.8614,且 ((SC-2a+SC-2b+SC-2c)-(SC-2d+SC-2e+SC-2f+SC-2g+SC-2h+SC-2i))/(SC-2a+SC-2b+SC-2c)将评估为((734+291+0)-(19+0+58+1+0+0))/(734+291+0)=0.9239 谷歌上的搜索提供了有关计算数学表达式的链

我有两张桌子:

Tbl1:

Tbl2:

是否可以使用Tbl1中特定日期的相应值计算Tbl2中的表达式

例如:2017年2月27日 SC-1a/SC-1b将评估为883/1025=0.8614,且 ((SC-2a+SC-2b+SC-2c)-(SC-2d+SC-2e+SC-2f+SC-2g+SC-2h+SC-2i))/(SC-2a+SC-2b+SC-2c)将评估为((734+291+0)-(19+0+58+1+0+0))/(734+291+0)=0.9239

谷歌上的搜索提供了有关计算数学表达式的链接,这些表达式中有直接的数字。在这种情况下,表达式中的文本需要替换为相应的数字,然后进行求值。我对SQL非常陌生,如有任何帮助,将不胜感激。谢谢你的帮助


问题也发布在

我在SSC上所做的回答上,但发布在这里,因为OP没有响应耗材DDL和样本数据请求:

CREATE TABLE #Metrics (MetricID VARCHAR(5),
                       MetricDate DATE,
                       MetricValue INT);

CREATE TABLE #Calculations (CalculationID VARCHAR(4), --These shouldn't have the same name in both tables as they are not the same thing
                            Calculation VARCHAR(500));
GO
INSERT INTO #Metrics
VALUES
('SC-1a','20170227',883),     
('SC-1b','20170227',1025),
('SC-2a','20170227',734),    
('SC-2b','20170227',291),   
('SC-2c','20170227',0),
('SC-2d','20170227',19),  
('SC-2e','20170227',0),   
('SC-2f','20170227',58),  
('SC-2g','20170227',1),   
('SC-2h','20170227',0),   
('SC-2i','20170227',0);

INSERT INTO #Calculations
VALUES
('SC-1','SC-1a / SC-1b'),
('SC-2', '((SC-2a + SC-2b + SC-2c) - (SC-2d + SC-2e + SC-2f + SC-2g + SC-2h + SC-2i)) / (SC-2a + SC-2b + SC-2c)');
GO

SELECT CalculationID, Calculation, 1 AS RN
FROM #Calculations C
     LEFT JOIN #Metrics M ON PATINDEX('%' + M.MetricID + '%', C.Calculation) > 0
WHERE C.CalculationID = 'SC-1'

GO
DECLARE @DATE DATE = '27-Feb-2017';

WITH Replacements AS (
    SELECT CalculationID, Calculation, Calculation As CastCalculation, 1 AS RN
    FROM #Calculations C
    --WHERE C.CalculationID = 'SC-1'

    UNION ALL

    SELECT R.CalculationID,
           CAST(REPLACE(R.Calculation, M.MetricID, CAST(M.MetricValue AS varchar(100))) AS varchar(500)),
           CAST(REPLACE(R.Calculation, M.MetricID, 'CAST(' + CAST(M.MetricValue AS varchar(100)) + ' AS decimal(12,4))') AS varchar(500)),
           RN + 1
    FROM Replacements R
         JOIN #Metrics M ON PATINDEX('%' + M.MetricID + '%', R.Calculation) > 0
                        AND M.MetricDate = @Date
                        AND CHAR(RN + 96) = RIGHT(M.MetricID,1)
                        )
SELECT *
INTO #DSQL
FROM Replacements R
WHERE RN = (SELECT MAX(sq.RN) FROM Replacements sq WHERE sq.CalculationID = R.CalculationID);

DECLARE @SQL VARCHAR(MAX);

SELECT @SQL = STUFF((SELECT 'UNION ALL' + CHAR(10) + 'SELECT ''' + CalculationID + ''' AS CalculationID, ''' + Calculation + ''' AS Calculation, ' + CastCalculation + ' AS CalculatedMetricValue' + CHAR(10)
                     FROM #DSQL
                     FOR XML PATH('')),1,10,'')

SELECT @SQL;

EXEC (@SQL);

DROP TABLE #DSQL;

GO
--Clean up
DROP TABLE #Metrics;
DROP TABLE #Calculations;
另外,是的,我知道我不需要临时表#DSQL,我可以把CTE替换的结果放进去。主要的原因是我在那一点上把它分开,这样我就可以把思维过程分开,然后我就不用费心把这两者合并在一起了

MetricID    MetricCalc
SC-1        SC-1a / SC-1b
SC-2       ((SC-2a + SC-2b + SC-2c) - (SC-2d + SC-2e + SC-2f + SC-2g + SC-2h + SC-2i)) / (SC-2a + SC-2b + SC-2c)
CREATE TABLE #Metrics (MetricID VARCHAR(5),
                       MetricDate DATE,
                       MetricValue INT);

CREATE TABLE #Calculations (CalculationID VARCHAR(4), --These shouldn't have the same name in both tables as they are not the same thing
                            Calculation VARCHAR(500));
GO
INSERT INTO #Metrics
VALUES
('SC-1a','20170227',883),     
('SC-1b','20170227',1025),
('SC-2a','20170227',734),    
('SC-2b','20170227',291),   
('SC-2c','20170227',0),
('SC-2d','20170227',19),  
('SC-2e','20170227',0),   
('SC-2f','20170227',58),  
('SC-2g','20170227',1),   
('SC-2h','20170227',0),   
('SC-2i','20170227',0);

INSERT INTO #Calculations
VALUES
('SC-1','SC-1a / SC-1b'),
('SC-2', '((SC-2a + SC-2b + SC-2c) - (SC-2d + SC-2e + SC-2f + SC-2g + SC-2h + SC-2i)) / (SC-2a + SC-2b + SC-2c)');
GO

SELECT CalculationID, Calculation, 1 AS RN
FROM #Calculations C
     LEFT JOIN #Metrics M ON PATINDEX('%' + M.MetricID + '%', C.Calculation) > 0
WHERE C.CalculationID = 'SC-1'

GO
DECLARE @DATE DATE = '27-Feb-2017';

WITH Replacements AS (
    SELECT CalculationID, Calculation, Calculation As CastCalculation, 1 AS RN
    FROM #Calculations C
    --WHERE C.CalculationID = 'SC-1'

    UNION ALL

    SELECT R.CalculationID,
           CAST(REPLACE(R.Calculation, M.MetricID, CAST(M.MetricValue AS varchar(100))) AS varchar(500)),
           CAST(REPLACE(R.Calculation, M.MetricID, 'CAST(' + CAST(M.MetricValue AS varchar(100)) + ' AS decimal(12,4))') AS varchar(500)),
           RN + 1
    FROM Replacements R
         JOIN #Metrics M ON PATINDEX('%' + M.MetricID + '%', R.Calculation) > 0
                        AND M.MetricDate = @Date
                        AND CHAR(RN + 96) = RIGHT(M.MetricID,1)
                        )
SELECT *
INTO #DSQL
FROM Replacements R
WHERE RN = (SELECT MAX(sq.RN) FROM Replacements sq WHERE sq.CalculationID = R.CalculationID);

DECLARE @SQL VARCHAR(MAX);

SELECT @SQL = STUFF((SELECT 'UNION ALL' + CHAR(10) + 'SELECT ''' + CalculationID + ''' AS CalculationID, ''' + Calculation + ''' AS Calculation, ' + CastCalculation + ' AS CalculatedMetricValue' + CHAR(10)
                     FROM #DSQL
                     FOR XML PATH('')),1,10,'')

SELECT @SQL;

EXEC (@SQL);

DROP TABLE #DSQL;

GO
--Clean up
DROP TABLE #Metrics;
DROP TABLE #Calculations;