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
@ 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 ... –
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 ..... –