Text 基于另一个表中的值计算文本表达式
我有两张桌子: 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非常陌生,如有任何帮助,将不胜感激。谢谢你的帮助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 谷歌上的搜索提供了有关计算数学表达式的链
问题也发布在我在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;