Boa noite, sou nova na linguagem SQL e gostaria de saber, se posso criar uma variável com um pivot dentro?

Exibições: 188

Respostas a este tópico

Bom dia Aline.

Não ficou muito clara a idéia de "variável com um pivot dentro", mas você poderia executar uma query pivot e, se o resultado for apenas uma linha, utilizar a instrução INTO para armazenar o resultado em variáveis ou criar um cursor que executa uma query pivot e armazenar o resultado linha a linha em variáveis. 

Acho que se tiver alguma maneira de exemplificar o que pretende, seria mais simples para lhe ajudarem.

Boa tarde Roni segue a minha consulta:

select * from 
(
select status 
from contrato
) as TblOrigem
pivot
(
count(status)
for status in (A,B,C,D,E,F,L,P,T) 
) as TabelaPivot

*Como já disse, gostaria armazenar essa consulta, dentro de uma variável. Quando tento armazenar, não sei se estou fazendo errado, ou se não posso fazer isso com variáveis.


declare @variavel as varchar(60)

set @variavel =
(select * from 
(
select status 
from contrato
) as TblOrigem
pivot
(
count(status)
for status in (A,B,C,D,E,F,L,P,T) 
) as TabelaPivot)

Dá o seguinte erro:

Mensagem 116, Nível 16, Estado 1, Linha 13
Somente uma expressão pode ser especificada na lista de seleção quando a subconsulta não é introduzida com EXISTS.

Entendi melhor, é o que eu havia pensado era nisso que posto abaixo, mas vou fazer um teste pra ver o resultado que você quer.

declare
@A as varchar(60),
@B as varchar(60),
@C as varchar(60),
@D as varchar(60),
@E as varchar(60),
@F as varchar(60),
@L as varchar(60),
@P as varchar(60),
@T as varchar(60);

begin

select
@A = [A],
@B = [B],
@C = [C],
@D = [D],
@E = [E],
@F = [F],
@L = [L],
@P = [P],
@T = [T]
from
(
select status
from contratos
) as TblOrigem
pivot
(
count(status)
for status in (A,B,C,D,E,F,L,P,T)
) as TabelaPivot;


PRINT 'A = ' + @A;
PRINT 'B = ' + @B;
PRINT 'C = ' + @C;
PRINT 'D = ' + @D;
PRINT 'E = ' + @E;
PRINT 'F = ' + @F;
PRINT 'L = ' + @L;
PRINT 'P = ' + @P;
PRINT 'T = ' + @T;

end;

Da pra fazer do jeito que vc pensou sim, olha só:

declare
@statement as nvarchar(max),
@parameter as nvarchar(max),
@resultset as nvarchar(max);

begin
set @parameter = N'@resultset as varchar(max) output';

set @statement = N'
select * from
(
select status from contratos
) as TblOrigem
pivot
(
count(status)
for status in (A,B,C,D,E,F,L,P,T)
) as TabelaPivot';


exec sp_executesql @statement, @parameter, @resultset output;

print @resultset;
end;

Boa tarde Roni.

Obrigada pela disponibilidade, mas como eu já disse estou começando agora com SQL e tenho algumas dúvidas, se puder me ajudar agradeceria.

1- Então, não entendi pq vc criou 3 variáveis, já que o resultado é só uma linha? :s

2- Quando vc seta elas:

set @parameter = N'@resultset as varchar(max) output';

set @statement = N'

O que significa  N'? É porque ela é do tipo nvarchar? Fiz uma pesquisa e pelo q eu pude entender seria isso. :s

3- Tentei executar sua query aqui e está dando erro na última linha, já tentei mexer e nada:

Mensagem 102, Nível 15, Estado 1, Linha 17
Sintaxe incorreta próxima a ';'.

Aline, vamos lá.

1) O motivo pelo qual criei 3 variáveis está na utilização da sp_executesql, embora a documentação diga que o valor padrão para a variável de parametros seja null, eu não obtive sucesso passando null ao invés de uma variável, se calhar eu fiz algo errado e não dei conta.

https://msdn.microsoft.com/pt-br/library/ms188001(v=sql.120).aspx

Embora o resultado seja só uma linha, ele contém várias colunas, ou você cria uma variável para armazenar o resultado de cada uma das colunas, como fiz no primeiro exemplo ou você executa a expressão no sp_executesql, se alguém conhecer outra maneira de fazer isso, agradeço se puderem se manifestar. Outra coisa que fiquei pensando, mas que não cheguei a testar seria fazer um cast do resultado para que o mesmo caiba em uma única variável e você possa utilizar a sintaxe que exemplificou inicialmente.

2) O tipo nvarchar é o varchar unicode, quer dizer que nvarchar é um tipo poliglota, ele entende os caracteres de outros sistemas de escrita como o chines por exemplo. Quando você utiliza o N'texto da string', você indica que este texto é unicode. Eu utilizei desta maneira porque os parametros de sp_executesql utilizam este tipo ao invés de simplesmente varchar.

https://pt.wikipedia.org/wiki/Unicode

https://msdn.microsoft.com/en-us/library/ms187752.aspx?f=255&MS...

Se está começando, leia as referencias do T-SQL em https://msdn.microsoft.com/en-us/library/bb510741.aspx

3) Observe que a minha query, eu sem querer, não observei o nome correto da sua tabela e acabei criando a mesma pluralizada, ao inves de contrato eu criei contratos. 

Dá uma lida nos links que lhe sugeri, sobre a sp_executesql e verifique a questão do item 3, sobre o nome da tabela e depois me diga qualquer coisa, no que puder vou dando uma força. 

Boa noite Roni.

Poxa obrigada pelas dicas, consegui executar as duas querys ! :)

Mas olha só, eu consegui entender a primeira query, melhor do que a segunda,

porque agora estou enrolada, com a sp_executesql e com o output das duas variáveis. Andei vendo alguns sites sobre essa stored procedure e o que eu entendi é que ela é uma procedure padrão que dinamiza a consulta, só isso. Poderia me explicar, para que eu venha entender melhor a sua procedure? Obrigada!

RSS

© 2017   Criado por Ramon Durães.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço