2017-03-01 140 views
0

一個文字表達我有兩個表:評估基於值從另一個表

TBL 1:

MetricID Date Value 
SC-1a 2/27/2017 883  
SC-1b 2/27/2017 1025  
SC-2a 2/27/2017 734  
SC-2b 2/27/2017 291  
SC-2c 2/27/2017 0 
SC-2d 2/27/2017 19 
SC-2e 2/27/2017 0 
SC-2f 2/27/2017 58 
SC-2g 2/27/2017 1 
SC-2h 2/27/2017 0 
SC-2i 2/27/2017 0 

TBL2:

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) 

是否有可能與以評估TBL2表達Tbl1中的特定日期的相應值? ((SC-2a + SC-2b + SC-2c) - (SC-1b)將評價爲883/1025 = 0.8614, ((734 + 291 + 0) - (SC-2e + SC-2e + SC-2c + SC- (19 + 0 + 58 + 1 + 0 + 0))/(734 + 291 + 0)= 0.9239

在Google上搜索提供的鏈接,用於評估其中包含直接數字的數學表達式。在這種情況下,表達式中的文本需要被相應的數字替換,然後進行評估。我很新的SQL和任何援助將不勝感激。感謝你的協助。

問題也張貼在https://www.sqlservercentral.com/Forums/1861974/Evaluating-a-Text-Expression-based-on-Values-from-another-table

回答

0

答案我在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替換中得到結果。主要原因是我在那個時候把它分開,這樣我就可以分開思考過程,然後我就不會把兩者合併在一起。

相關問題