2016-07-07 6 views
0

Ich versuche Werte in eine Zeichenfolge auf der Spalte ‚Yearmonth‘ und ‚Timedimensiondate‘ im ‚Mathlogictable‘ gezeigt in folgenden Code basiert auf repalce ....Ersetzen Werte in einer Zeichenfolge mit Rekursion in SQL

Ich konnte es erfolgreich machen, aber jetzt muss ich die Zeichenfolge durch Nullwerte ersetzen, die im Mathlogictable nicht vorhanden sind.

Für zB: Wenn Sie den Code unten ausführen können wir die erste Zeile mit Werten für den Import-consumptionqty1 (314), aber nicht für den Import consumtionQty (1539) ..... wie

YEARMONTH   OUTPUTFORMULA         TIMEDIMENSIONDATE     
    CV(N1) 2002: 10 236846.000 + Import - Consumption qty1(1539) 2002-10-01 

Ich finde muß die Saiten ersetzen, die meine Ausgabe wie

Yearmonth   Formula   TimeDimensionDate  
CV(N1) 2002: 10 236846.000 + 0 2002-10-01 

Wie kann ich das sein sollte keinen Wert auf Null in der Formel-Spalte haben ...... so die erreichen?

Bitte beachten Sie, dass ich eine Tem Tabelle namens #tablevaluedfunction erstellt haben und die Ausgabe in dieser Tabelle eingefügt .... und eine Verknüpfung gemacht .....

Unten ist der Code i versucht bin

Begin 
CREATE TABLE #MathLogicTable 
(
IDNUM INTEGER IDENTITY(1,1), 
FORMULA Varchar(160), 
INPUTName varchar(160), 
AttributeValue Decimal(15,3), 
yearmonth varchar(160), 
TimeDimensionDate date 
) 

INSERT INTO #MathLogicTable (FORMULA,INPUTName,AttributeValue,yearmonth,TimeDimensionDate) 
VALUES ('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(1539)',855,'CV(N1) 2002: 1','2002-01-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(1539)',4860,'CV(N1) 2002: 2','2002-02-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(1539)',21683,'CV(N1) 2002: 3','2002-03-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(1539)',12800,'CV(N1) 2002: 4','2002-04-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(1539)',802,'CV(N1) 2002: 5','2002-05-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(314)',250616,' CV(N1) 2002: 6 ','2002-06-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(314)',333064,' CV(N1) 2002: 7 ','2002-07-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(314)',131397,' CV(N1) 2002: 8 ','2002-08-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(314)',294510,' CV(N1) 2002: 9 ','2002-09-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(314)',236846,' CV(N1) 2002: 10 ','2002-10-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(314)',397183,' CV(N1) 2002: 11 ','2002-11-01') 
,('Import - Consumption qty1(314) + Import - Consumption qty1(1539)','Import - Consumption qty1(314)',128616,' CV(N1) 2002: 12 ','2002-12-01') 

;WITH cteSplitFormula AS (
    SELECT 
     IDNUM 
     ,TimeDimensionDate 
     ,CAST(LTRIM(RTRIM(LEFT(FORMULA, PATINDEX('%[+\*/^]%',FORMULA+'+')-1))) AS VARCHAR(5000)) AS FormulaItem 
     ,STUFF(FORMULA, 1, PATINDEX('%[+\*/^]%',FORMULA+'+'), '') as RemainingFromula 
    FROM 
     #MathLogicTable 

    UNION ALL 
    SELECT 
     IDNUM 
     ,TimeDimensionDate 
     ,CAST(LTRIM(RTRIM(LEFT(RemainingFromula, PATINDEX('%[+\*/^]%',RemainingFromula+'+')-1))) AS VARCHAR(5000)) AS FormulaItem 
     ,STUFF(RemainingFromula, 1, PATINDEX('%[+\*/^]%',RemainingFromula+'+'), '') as RemainingFromula 
    FROM 
     cteSplitFormula 
    WHERE 
     LEN(RemainingFromula) > 0 

) 

, ctePartsValues AS (
    SELECT 
     sf.IDNUM 
     ,sf.TimeDimensionDate 
     ,sf.FormulaItem AS FormulaItem 
     ,ISNULL(m.AttributeValue,0) AS ReplacementValue 
     ,ROW_NUMBER() OVER(PARTITION BY sf.IDNUM ORDER BY (SELECT 1)) AS [ReplacementOrderID] 
    FROM 
     cteSplitFormula sf 
     FULL OUTER JOIN #MathLogicTable m 
     ON sf.FormulaItem = LTRIM(RTRIM(m.INPUTName)) 
     AND sf.TimeDimensionDate = m.TimeDimensionDate 
) 

, cteRecursiveDataSource AS (
    SELECT 
     m.IDNUM 
     ,REPLACE(m.Formula,pv.FormulaItem,pv.ReplacementValue) as Formula 
     ,pv.ReplacementOrderID 
    FROM 
     #MathLogicTable m 
     INNER JOIN ctePartsValues pv 
     ON m.IDNUM = pv.IDNUM 
     AND pv.ReplacementOrderID = 1 

    UNION ALL 

    SELECT 
     rds.IDNUM 
     ,REPLACE(rds.Formula,pv.FormulaItem,pv.ReplacementValue) as Formula 
     ,pv.ReplacementOrderID 
    FROM 
     cteRecursiveDataSource rds 
     INNER JOIN ctePartsValues pv 
     ON rds.IDNUM = pv.IDNUM 
     AND rds.ReplacementOrderID + 1 = pv.ReplacementOrderID 
) 

, cteIdentifyRowWithLastReplacementStatement AS (
    SELECT 
     * 
     ,ROW_NUMBER() OVER (PARTITION BY IDNUM ORDER BY ReplacementOrderId DESC) as FinalRow 
    FROM 
     cteRecursiveDataSource 
) 

SELECT * 
FROM 
    cteIdentifyRowWithLastReplacementStatement 
WHERE 
    FinalRow = 1 


DROP table #MathLogicTable 
END 

Dank

+0

@ Matt: ich getan haben einige Änderungen hoffen, seine jetzt klar .... im vorherigen Kommentar, den Sie erwähnten, dass Sie did'nt die rekursive Tabellencode zu bekommen, deshalb habe ich erwähnt auszuführen der Code ... Ich appre Citiate Ihre Hilfe und Vorschläge ... –

+0

Ja, was Sie gesagt haben, ist wahr ..... Ich habe nur die Hälfte der Daten hier (und das ist der Punkt, den ich brauche, um die fehlenden Daten mit Null in der Formel zu ersetzen) ... da wird mehr Seiten in der Formel sein .... es wird jedes mathematische Symbol geben, solange dynamische SQL es tut ..... –

Antwort

1
;WITH cteSplitFormula AS (
    SELECT 
     IDNUM 
     ,TimeDimensionDate 
     ,CAST(LTRIM(RTRIM(LEFT(REPLACE(Formula,'Import -','ImportReplaced'), PATINDEX('%[+-\*/^]%',REPLACE(Formula,'Import -','ImportReplaced')+'+')-1))) AS VARCHAR(5000)) AS FormulaItem 
     ,STUFF(REPLACE(Formula,'Import -','ImportReplaced'), 1, PATINDEX('%[+-\*/^]%',REPLACE(Formula,'Import -','ImportReplaced')+'+'), '') as RemainingFromula 
    FROM 
     #MathLogicTable 

    UNION ALL 
    SELECT 
     IDNUM 
     ,TimeDimensionDate 
     ,CAST(LTRIM(RTRIM(LEFT(RemainingFromula, PATINDEX('%[+-\*/^]%',RemainingFromula+'+')-1))) AS VARCHAR(5000)) AS FormulaItem 
     ,STUFF(RemainingFromula, 1, PATINDEX('%[+-\*/^]%',RemainingFromula+'+'), '') as RemainingFromula 
    FROM 
     cteSplitFormula 
    WHERE 
     LEN(RemainingFromula) > 0 

) 

, ctePartsValues AS (
    SELECT 
     sf.IDNUM 
     ,sf.TimeDimensionDate 
     ,REPLACE(sf.FormulaItem,'ImportReplaced','Import -') AS FormulaItem 
     ,ISNULL(m.AttributeValue,0) AS ReplacementValue 
     ,ROW_NUMBER() OVER(PARTITION BY sf.IDNUM ORDER BY (SELECT 1)) AS [ReplacementOrderID] 
    FROM 
     cteSplitFormula sf 
     FULL OUTER JOIN #MathLogicTable m 
     ON REPLACE(sf.FormulaItem,'ImportReplaced','Import -') = LTRIM(RTRIM(m.INPUTName)) 
     AND sf.TimeDimensionDate = m.TimeDimensionDate 
) 

, cteRecursiveDataSource AS (
    SELECT 
     m.IDNUM 
     ,REPLACE(m.Formula,pv.FormulaItem,pv.ReplacementValue) as Formula 
     ,pv.ReplacementOrderID 
    FROM 
     #MathLogicTable m 
     INNER JOIN ctePartsValues pv 
     ON m.IDNUM = pv.IDNUM 
     AND pv.ReplacementOrderID = 1 

    UNION ALL 

    SELECT 
     rds.IDNUM 
     ,REPLACE(rds.Formula,pv.FormulaItem,pv.ReplacementValue) as Formula 
     ,pv.ReplacementOrderID 
    FROM 
     cteRecursiveDataSource rds 
     INNER JOIN ctePartsValues pv 
     ON rds.IDNUM = pv.IDNUM 
     AND rds.ReplacementOrderID + 1 = pv.ReplacementOrderID 
) 

, cteIdentifyRowWithLastReplacementStatement AS (
    SELECT 
     * 
     ,ROW_NUMBER() OVER (PARTITION BY IDNUM ORDER BY ReplacementOrderId DESC) as FinalRow 
    FROM 
     cteRecursiveDataSource 
) 

SELECT * 
FROM 
    cteIdentifyRowWithLastReplacementStatement 
WHERE 
    FinalRow = 1 
+0

hi matt ... danke für die Hilfe ... ich bin nur mit der ersten Hälfte fest der code ... ich habe eine tabellenwertfunktion erstellt um die formel basierend auf delimiltern aufzuteilen, aber was verbindet sie innerlich mit .... formula? –

+0

Hi matt ... Ich habe es versucht, aber ich konnte es nicht schaffen ... Irgendwo trifft das Konzept einen Fehler ... Ich habe Code geändert, um eine Laufzeitprüfung dafür durchzuführen ... lass es mich wissen, wenn du helfen könntest .... –

+0

sicher .. Willst du, dass ich das als neuen Beitrag mache? –

Verwandte Themen