sql - tab - set quoted_identifier on para que sirve
Reemplazar alfabetos a cero en cualquier cadena dada en SQL (1)
Esto requiere una serie de técnicas un tanto avanzadas combinadas para hacer esto. El primer problema es que tienes datos delimitados. Esto viola 1NF cuando se incluyen múltiples valores en una sola celda. La segunda pieza del rompecabezas es cómo PIVOTAR esta información en un número dinámico de columnas. La mayoría de las personas cercanas a SO prefieren usar un PIVOT dinámico. Prefiero usar una pestaña cruzada dinámica en su lugar. Encuentro que la sintaxis es menos obtusa e incluso es un poco más eficaz que una tabla cruzada dinámica.
Puedes leer sobre el divisor que suelo usar aquí. http://www.sqlservercentral.com/articles/Tally+Table/72993/ La principal ventaja que ofrece este divisor que la mayoría de los demás no ofrece es que devuelve el número de fila del artículo dentro de la lista de valores. Esto es increíblemente útil para este tipo de situación. Si realmente quieres sumergirte en el mundo de los divisores, hay otras opciones excelentes. http://sqlperformance.com/2012/07/t-sql-queries/split-strings
Puede leer más sobre las pestañas cruzadas dinámicas aquí. http://www.sqlservercentral.com/articles/Crosstab/65048/
Realmente no entiendo qué tiene que ver la tabla #STATICFILTER con esto, así que simplemente lo ignoré.
Asegúrese de comprender este código antes de implementarlo. Los artículos referenciados entran en gran detalle sobre estas técnicas.
if OBJECT_ID(''tempdb..#MathTemp1'') is not null
drop table #MathTemp1
CREATE TABLE #MathTemp1
(
IDNUM INTEGER IDENTITY(1,1),
YEARMONTH VARCHAR(256),
OutputFormula VARCHAR(256),
Timedimensiondate Date
)
INSERT INTO #MathTemp1 (YEARMONTH,OUTPUTFORMULA,Timedimensiondate)
VALUES (''CV(N2) 1989: 1'',''2641.000 + Import - Consumption customs value(1540) + Import - Consumption customs value(1541)'',''1989-01-01'')
,(''CV(N2) 1989: 10'',''54407.000 + Import - Consumption customs value(1540) + 63906.000'',''1989-10-01'')
,(''CV(N2) 1990: 11'',''Import - Consumption customs value(2266) + Import - Consumption customs value(1540) + 53088.000'',''1990-11-01'')
,(''CV(N2) 1994: 5'',''32852.000 + Import - Consumption customs value(1540) + Import - Consumption customs value(1541)'',''1994-05-01'')
declare @StaticPortion nvarchar(2000) =
''with OrderedResults as
(
select mt.IDNUM
, mt.OutputFormula
, mt.Timedimensiondate
, mt.YEARMONTH
, x.ItemNumber
, LTRIM(RTRIM(x.Item)) as Item
from #MathTemp1 mt
cross apply dbo.DelimitedSplit8K(mt.OutputFormula, ''''+'''') x
)
Select IDNUM'';
declare @DynamicPortion nvarchar(max) = '''';
declare @FinalStaticPortion nvarchar(2000) = '' from OrderedResults Group by IDNUM order by IDNUM'';
with E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select @DynamicPortion = @DynamicPortion +
'', MAX(Case when ItemNumber = '' + CAST(N as varchar(6)) + ''then case when ISNUMERIC(Item) = 1 then convert(numeric(9,3), ltrim(rtrim(Item))) else 0 end end) as Value'' + CAST(N as varchar(6)) + CHAR(10)
from cteTally t
where t.N <=
(
select MAX(LEN(OutputFormula) - LEN(replace(OutputFormula, ''+'', ''''))) + 1
from #MathTemp1
)
declare @SqlToExecute nvarchar(max) = @StaticPortion + @DynamicPortion + @FinalStaticPortion;
--select @SqlToExecute
exec sp_executesql @SqlToExecute
Estoy tratando de reemplazar algunas cadenas de entrada en una fórmula a cero. Pude hacerlo para ciertas cadenas, pero no pude hacerlo para todas las cadenas enumeradas en la siguiente tabla #mathtemp.
Tengo los nombres de entrada, tengo la fórmula y todo lo que tengo que hacer es pagar las cadenas que no tienen números (valores) a cero. Hay un error en la declaración de reemplazo que no puedo descifrar.
Traté de usar ISNUMERIC para hacer esto, pero eso no da el resultado requerido. Avíseme si hay alguna idea nueva para hacer esto o para resolver el siguiente.
BEGIN
DECLARE @INPUTCOUNT AS INTEGER
DECLARE @formulacount as integer
DECLARE @in as int
DECLARE @ia as int
DECLARE @OUTPUTFORMULATrade as nvarchar(160)
set @ia = 1
set @in = 1
CREATE TABLE #STATICFILTER
(
IDNUM INTEGER IDENTITY(1,1),
STATICNAME Varchar(160),
)
INSERT INTO #STATICFILTER (STATICNAME)
VALUES (''Import - Consumption customs value(2266)'') ,(''Import - Consumption customs value(1540)'') ,(''Import - Consumption customs value(1541)'')
SET @INPUTCOUNT = (select count(*) from #STATICFILTER)
CREATE TABLE #MathTemp1
(
IDNUM INTEGER IDENTITY(1,1),
YEARMONTH VARCHAR(256),
OUTPUTFORMULA VARCHAR(256),
Timedimensiondate Date
)
INSERT INTO #MathTemp1 (YEARMONTH,OUTPUTFORMULA,Timedimensiondate)
VALUES (''CV(N2) 1989: 1'',''2641.000 + Import - Consumption customs value(1540) + Import - Consumption customs value(1541)'',''1989-01-01'')
,(''CV(N2) 1989: 10'',''54407.000 + Import - Consumption customs value(1540) + 63906.000'',''1989-10-01'')
,(''CV(N2) 1990: 11'',''Import - Consumption customs value(2266) + Import - Consumption customs value(1540) + 53088.000'',''1990-11-01'')
,(''CV(N2) 1994: 5'',''32852.000 + Import - Consumption customs value(1540) + Import - Consumption customs value(1541)'',''1994-05-01'')
SET @formulacount = (select count(*) from #MathTemp1)
while (@ia < @formulacount)
begin
WHILE (@in < @INPUTCOUNT)
BEGIN
SET @OUTPUTFORMULATrade = (Select Replace ((SELECT REPLACE(OUTPUTFORMULA,(select STATICNAME from #STATICFILTER where IDNUM = @in),0)FROM #MathTemp1 WHERE IDNUM = @ia),(select STATICNAME from #STATICFILTER where IDNUM = @in+1),0))
SET @in = @in + 1
END
SET @ia = @ia + 1
SET @in =1
Select @OUTPUTFORMULATrade AS New
END
drop table #MathTemp1
drop table #STATICFILTER
END
tenga en cuenta que las entradas están dispuestas en un formato aleatorio en la tabla #staticfilter y, de manera similar, la tabla #mathtemp también puede tener cualquier combinación de fórmulas de entrada.
Mi resultado deseado es reemplazar las cadenas en cualquier fórmula dada a cero vlaues. por favor revise a continuación
2641.000 + 0 + 0
54407.000 + 0 + 63906.000
0 + 0 + 53088.000