Jump to content
ferreira12

automatizar função

Recommended Posts

ferreira12

Boas... Tenho a seguinte função abaixo descrita.

ela devolve-me informação mediante a data, e agora queria que ela me devolvesse para os dias todos mas separadamente. ou seja tenho de repetir isto 31 vezes

select 1 as dia, REPLACE(site,'aa','') as teste,
Valor = SUM(CASE WHEN not REPLACE(teste,'aa','') like '%aa%' and not teste like '%aa%' THEN Valor END)
from fnValor ('10-20-2013 00:01','10-20-2013 23:59')
union
select 2 as dia, REPLACE(site,'aa','') as teste
Valor = SUM(CASE WHEN not REPLACE(teste,'aa','') like '%aa%' and not teste like '%aa%' THEN Valor END)
from fnValor ('10-20-2013 00:01','10-20-2013 23:59')

ok, ela devolve-me informação desejada. mas eu queria tentar simplificar um pouco mais isto.

para isso não existe por exemplo a possibilidade de eu passar apenas uma vez o cabeçalho, ou seja esta parte do código?

Valor = SUM(CASE WHEN not REPLACE(teste,'aa','') like '%aa%' and not teste like '%aa%' THEN Valor END)

pois este é igual para todos...

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Não sei se isto te ajuda:

-- Defines a data inicial
DECLARE @DataInicial DATE = '20131021';
DECLARE @DataSTR CHAR(10);

-- Declara uma tabela, que vai ser o teu output
DECLARE @Tabela TABLE (Dia TINYINT, Teste VARCHAR(100), Valor INT);
DECLARE @Contador TINYINT = 1;
WHILE @Contador <= 31
BEGIN
   SET @DataSTR = CONVERT(CHAR(10), @DataInicial, 121);

  -- Insere os dados que vêm da função na tabela temporária
   INSERT INTO @Tabela
   SELECT @Contador AS Dia, REPLACE(site,'aa','') as teste, Valor = SUM(CASE WHEN not REPLACE(teste,'aa','') like '%aa%' and not teste like '%aa%' THEN Valor END)
       FROM fnValor(@DataSTR + '00:01', @DataSTR + ' 23:59');

   SET @DataInicial = DATEADD(dd, 1, @DataInicial);
   SET @Contador = @Contador + 1;
END

-- Retorna os dados
SELECT Dia, Teste, Valor
   FROM @Tabela;

Espero ter ajudado.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
ferreira12

Olá, parece uma boa solução, mas entretanto está a dar um erro na concatenação.

Incorrect syntax near '+'.

estive a ver e a concatenação é com + na sintaxe do sql server. Qual a razão deste erro?

Share this post


Link to post
Share on other sites
AntonioMateus

A solução à boa, não haverá muitas mais alternativas.

Deve estar a faltar o espaço na primeira concatenação

fnValor(@DataSTR + '00:01', @DataSTR + ' 23:59');

e deves precisar de criar a string das datas antes de passar para a função, não aceita concatenares na chamada.

Share this post


Link to post
Share on other sites
ferreira12

já consegui colocar a funcar o contador.

Só falta um promenor, não existe maneira de eu em vez de colocar o contador a 31, arranjar uma forma de devolver o Total de dias da que mês que colocamos no parametro

DECLARE @DataInicial DATE = '20131021'

Share this post


Link to post
Share on other sites
Rechousa

Olá,

Só falta um promenor, não existe maneira de eu em vez de colocar o contador a 31, arranjar uma forma de devolver o Total de dias da que mês que colocamos no parametro

Existe sim. Podes fazer de duas formas. Se tiveres SQL Server 2012, basta usares a função EOMONTH, senão terás de usar outro truque (ir ao primeiro dia do mes seguinte e retirar um dia para ir ao último dia do mes anterior - depois é só obter o dia):

DECLARE @ADate DATETIME
SET @ADate = '20200201'

-- SQL Server 2012
SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth

-- SQL Server 2005, 2008, etc.
SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@ADate)+1,0)))

Só tens de passar o valor para uma variável.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
ferreira12

Boas peço desculpa por só voltar agora a dar noticias...

Acontece uma coisa estranha, pois quando coloco WHILE @Contador <= 30 ele devolve apenas os 30 registos, caso coloque o outro while ele devolve me 31.

Mas verificando com um

select DATEPART(DAY, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DataInicial)+1,0)))

ele devolve me a data correcto. Onde estou a falhar?

O código está da seguinte forma

-- Defines a data inicial
DECLARE @DataInicial DATETIME = '09-01-2013 1:00';
DECLARE @DataFinal DATETIME = DATEADD(d,1,'09-01-2013 1:00');
DECLARE @DataDeI CHAR(16);
DECLARE @DataAF CHAR(16);
-- Declara uma tabela, que vai ser o teu output
DECLARE @Tabela TABLE (Dia TINYINT, Teste VARCHAR(100), Valor Money);
DECLARE @Contador TINYINT = 1;
WHILE @Contador <= DATEPART(DAY, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DataInicial)+1,0)))
--WHILE @Contador <= 30
BEGIN
SET @DataDeI = CONVERT(CHAR(16), @DataInicial, 121);
SET @DataAF = CONVERT(CHAR(16),DATEADD(d,1,@DataInicial), 121);
-- Insere os dados que vêm da função na tabela temporária
INSERT INTO @Tabela
SELECT @Contador AS Dia, Teste, Valor
 FROM fnValor(@DataDeI,@DataAF,-1,-1,-1);

SET @DataInicial = DATEADD(dd, 1, @DataInicial);
SET @DataFinal = DATEADD(dd, 1, @DataFinal);
SET @Contador = @Contador + 1;
END
-- Retorna os dados
SELECT Dia, Teste Valor
FROM @Tabela;

Edited by Rui Carlos
GeSHi

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.