Inquiridor
Trocar Colunas por Registros.... Pivot

Pergunta
-
Todas as Respostas
-
-
-
Adriano,
A principio um Pivot poderia resolver sim.
Veja se este exemplo ajuda, mas teste no SQL Server 2005.
Code SnippetCreate
table #Exemplo (codigo int, nome varchar(10))insert
into #Exemplo (codigo, nome) Values (1,'jose')insert
into #Exemplo (codigo, nome) Values (2,'mario')insert
into #Exemplo (codigo, nome) Values (1,'jose')insert
into #Exemplo (codigo, nome) Values (2,'mario')insert
into #Exemplo (codigo, nome) Values (3,'celso')insert
into #Exemplo (codigo, nome) Values (4,'andre')Select
[jose],[mario],[celso],[andre] from #exemploPivot
(count(codigo) for nome in ([jose],[mario],[celso],[andre])) p -
-
-
no 2000 da um pouco de trabalho ou vc. usa case em subquery ( aproveitando o exemplo do junior )
Create table #Exemplo (codigo int, nome varchar(10))
insert into #Exemplo (codigo, nome) Values (1,'jose')insert into #Exemplo (codigo, nome) Values (2,'mario')
insert into #Exemplo (codigo, nome) Values (1,'jose')
insert into #Exemplo (codigo, nome) Values (2,'mario')
insert into #Exemplo (codigo, nome) Values (3,'celso')
Select sum([jose]) As Jose, sum([mario]) As mario , sum([celso]) As Celso
From (
Select [jose] = Case when nome = 'jose' then codigo else 0 End,
[mario] = Case when nome = 'mario' then codigo else 0 End,
[celso] = Case when nome = 'celso' then codigo else 0 End
From #Exemplo) DrvTblmais se for dinamico ou seja vc. nao sabe quantas colunas vai ter e mais chato de fazer exemplo:
-- Esta funcao e para retornar somente o dia 01 de todos os meses
CREATE FUNCTION fn_RBMS_ReturnMonth (@Vdata as Datetime)
RETURNS DateTime
AS
BEGIN
return cast(Str(month(@Vdata)) + '/01/'+ ltrim(Str(year(@Vdata))) as SMALLDateTime)
END
-- -- Cria uma Tabela de Exemplo
Create Table #Dados (Idx int identity(1,1), Valor Numeric (19,2), Data DateTime)
Insert Into #Dados (Valor, Data) Values (150.10, '2004-01-01')
Insert Into #Dados (Valor, Data) Values (150.10, '2004-02-01')
Insert Into #Dados (Valor, Data) Values (150.10, '2004-04-01')
Insert Into #Dados (Valor, Data) Values (150.10, '2004-05-01')
Insert Into #Dados (Valor, Data) Values (150.10, '2004-01-02')
Insert Into #Dados (Valor, Data) Values (150.10, '2004-05-07')
Insert Into #Dados (Valor, Data) Values (150.10, '2004-01-08')
Create Table #PivotTabela (CampoChave Int)
Insert into #PivotTabela (CampoChave) Values (1) -- So para criar uma linha em branco
Declare @DataI Datetime -- Sao Variaveis para fazer o loop
Declare @DataF Datetime --
Select @DataI = Dbo.fn_RBMS_ReturnMonth(Min(Data)), @DataF = Dbo.fn_RBMS_ReturnMonth(Max(Data))
From #Dados
-- Alimenta com a menor e a maior data para definir o range
Declare @TotalMes Numeric(19,2)
Declare @StringDDL Varchar(1000)
While @DataI <= @DataF
Begin
Select @TotalMes = Sum(Valor) From #Dados
Where Dbo.fn_RBMS_ReturnMonth(Data) = @DataI
If @TotalMes > 0
Begin
Set @StringDDL = 'Alter Table #PivotTabela Add [' + Right(Convert(Char(10),@DataI,105),7) + '] Numeric(19,2) '
Exec(@StringDDL)
Set @StringDDL = 'Update #PivotTabela Set [' + Right(Convert(Char(10),@DataI,105),7) + '] = ' + convert(varchar(30),@Totalmes)
Exec(@StringDDL)
Set @TotalMes = 0
End
Set @DataI = DateAdd(m,1, @DataI)
End
Select * From #PivotTabela
qq retorne.