Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

thicomp

Agrupamento de dados

Recommended Posts

Pessoal, boa tarde!

 

Estou com uma dúvida quanto a disponibilizar informações a partir de um select.

 

Tenho uma tabela com os campos como estes abaixo

 

NR_Re | NM_Colab | QT_Req | MES_Req |

----------------------------------------------------------

1234 | Nome | 15 | 9 |

----------------------------------------------------------

1234 | Nome | 5 | 10 |

----------------------------------------------------------

1475 | Nome 2 | 15 | 10 |

----------------------------------------------------------

 

Meu select está neste formato

 

SELECT NR_Re, NM_Colab, SUM(QT_Req), MES_Req from colab group by NR_Re, NM_Colab, MES_Req

 

Na disponibilização dos dados, eu preciso com que as linhas 1 e 2 acima, sejam mostradas na tela em uma mesma linha, sendo que a coluna 4, da tabela acima, sejam mostradas em colunas diferentes na tela.

Da forma como esta descrito meu select, ele cria duas linhas para cada coluna MES_Req diferente.

Alguem teria alguma sugestão?

 

Abraços

 

Thiago

Compartilhar este post


Link para o post
Compartilhar em outros sites

Thiago, acho que tera que fazer um PIVOT nesta sua consulta, mas ficou meio confuso.

Tem como postar o jeito que precisa dos dados, a partir desde mesmo exemplo?

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, bom dia!

 

Obrigado pelo retorno.

 

A última coluna é uma coluna de mês, ou seja, o select teria que agrupar pelo número do usuário (NR_Re) e disponibilizar as informações do mesmo usuário na mesma linha.

O sistema gerará uma tabela onde estarão discriminados todos os meses, mais ou menos assim

 

NR_Re | NM_Colab | JAN | FEV | MAR | ABR | MAI | JUN | JUL | AGO | SET | OUT | NOV | DEZ |

------------------------------------------------------------------------------------------------------------------------------------------------

1234 | Nome | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 15 | 5 | 0 | 0 |

------------------------------------------------------------------------------------------------------------------------------------------------

1475 | Nome 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 15 | 0 | 0 |

------------------------------------------------------------------------------------------------------------------------------------------------

 

Ficaria algo assim... e se existir novos registros para o mesmo usuário em um mesmo mês, esses valores (mensal) devem ser somados.

Através do comando select acima, eu consigo fazer com que a primeira linha, onde tenho dois meses diferentes, cada mês estão sendo disponibilizados em duas linhas.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um exemplo rapido:

/*
NR_Re | NM_Colab | QT_Req | MES_Req |
----------------------------------------------------------
1234     | Nome        | 15           | 9               |
----------------------------------------------------------
1234     | Nome        | 5             | 10             |
----------------------------------------------------------
1475     | Nome 2     | 15           | 10             |
----------------------------------------------------------
*/


declare @table table (NR_Re int, NM_Colab varchar(max), QT_Req int, MES_Req int)

insert into @table values (1234,'Nome',15,9)
insert into @table values (1234,'Nome',5,10)
insert into @table values (1475,'Nome 2',15,10)

insert into @table values (1475,'Nome 2',1,2)
insert into @table values (1475,'Nome 2',8,2)

select * from @table

Select NM_Colab
         , [1] as Jan
         , [2] as Fev
         , [3] as Mar
         , [4] as Abr
         , [5] as Mai
		 , [6] as Jun         
         , [7] as Jul
         , [8] as Ago
         , [9] as [Set]
         , [10] as [Out]
         , [11] as Nov
         , [12] as Dez
from @table pivot (sum(QT_Req) for MES_Req in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) p
order by 1;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá!

 

Eu não conhecia esse comando... achei bem interessante.

No meu caso, a coluna MES_Req não necessariamente terá todos os meses cadastrados, e pelo que andei pesquisando pela função, ela pega valores (colunas) fixas, é isso?

Mesmo assim é possível executar esta função?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá!

 

Eu não conhecia esse comando... achei bem interessante.

No meu caso, a coluna MES_Req não necessariamente terá todos os meses cadastrados, e pelo que andei pesquisando pela função, ela pega valores (colunas) fixas, é isso?

Mesmo assim é possível executar esta função?

No caso dos meses, sao fixos pois podem ter "Nomes" com meses preenchidos ou não.

 

Até pode-se montar dinamico, mas depende muito da estrutura

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao tentar executar esse select, está me retornando este erro

 

Microsoft OLE DB Provider for ODBC Drivers

error '80040e14'

[Microsoft][ODBC Text Driver] Syntax error in FROM clause.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código é este... ele pega as informações de um arquivo .txt onde as informações estão inseridas de acordo com o título das colunas

NR_Re;NM_Colab;CD_Set;CD_It;NM_It;QT_Req;DIA_Req;MES_Req;ANO_Req;

Set Conn=Server.CreateObject("ADODB.Connection") ' Set the Dbq portion of the string to the physical folder where your price files reside Conn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _ "Dbq=E:\caminho_do_arquivo";" & _ "Extensions=asc,csv,tab,txt;" & _ "Persist Security Info=false" sql="Select NM_Colab, [1] as Jan, [2] as Fev, [3] as Mar, [4] as Abr, [5] as Mai, [6] as Jun, [7] as Jul, [8] as Ago, [9] as [set], [10] as [Out], [11] as Nov, [12] as Dez from "&request.querystring("re")&".txt pivot (sum(QT_Req) for MES_Req in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) p order by 1" Set rs=conn.execute(sql) While Not rs.EOF response.write "<TR bgcolor='#EEF3F9'><TD bgcolor='#EDEBEB'><B>"&rs(1)&"</B>" For i=1 to 12 response.write "<TD align='center'>" IF Int(rs(3))=Int(i) Then response.write rs(2) Else response.write "0" End IF Next equip=rs(1) rs.MoveNext Wend rs.close Set rs=Nothing conn.close Set conn=Nothing

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa, nem tinha visto!

O código para visualização dos dados é este

Set Conn=Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"Dbq=E:\caminho_do_arquivo;" & _
"Extensions=asc,csv,tab,txt;" & _
"Persist Security Info=false"
sql="Select NM_Colab, [1] as Jan, [2] as Fev, [3] as Mar, [4] as Abr, [5] as Mai, [6] as Jun, [7] as Jul, [8] as Ago, [9] as [Set], [10] as [Out], [11] as Nov, [12] as Dez from "&request.querystring("re")&".txt pivot (sum(QT_Req) for MES_Req in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) p order by 1"
Set rs=conn.execute(sql)
			
	While Not rs.EOF
		response.write "<TR bgcolor='#EEF3F9'><TD bgcolor='#EDEBEB'><B>"&rs(1)&"</B>"
				
		For i=1 to 12
			response.write "<TD align='center'>"
			
			IF Int(rs(3))=Int(i) Then
				response.write rs(2)
			Else
				response.write "0"
			End IF
		Next
		equip=rs(1)
		rs.MoveNext
	Wend
	rs.close
	Set rs=Nothing
	conn.close
	Set conn=Nothing

Se eu insiro o comando abaixo, na variável sql do código acima, ele me retorna todos os valores corretamente, mas a cada mês diferente, ele mostra em uma linha na tabela. No caso eu preciso que os meses fiquem todos na mesma linha.

 

sql="SELECT CD_It, NM_It, SUM(QT_Req), MES_Req from "&request.querystring("re")&".txt group by CD_It, NM_It, MES_Req order by NM_It"

 

NR_Re | NM_Colab | JAN | FEV | MAR | ABR | MAI | JUN | JUL | AGO | SET | OUT | NOV | DEZ |

------------------------------------------------------------------------------------------------------------------------------------------------

1234 | Nome | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 15 | 5 | 0 | 0 |

------------------------------------------------------------------------------------------------------------------------------------------------

1475 | Nome 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 15 | 0 | 0 |

------------------------------------------------------------------------------------------------------------------------------------------------

 

 

A tabela de onde ele pega as informações está cadastrada desta maneira

 

NR_Re;NM_Colab;CD_Set;CD_It;NM_It;QT_Req;DIA_Req;MES_Req;ANO_Req;
3401;Nome Usuario;40901;125478;;Nome do item;1;30;09;2014;
3401;Nome Usuario;40901;125478;Nome do item;2;17;10;2014;
3401;Nome Usuario;40901;125477;Nome do item;2;17;10;2014;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei que fosse SQL2000, por isso perguntei.

 

Seria possivel colocar estes txt em uma tabela fisica e depois fazer o pivot?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como coloca-lo em uma tabela física?

Você diz de recuperar todas as informações do arquivo e montar a tabela via código, e a partir desta fazer o pivot?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.