Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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
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;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?
>
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
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.
manda a sintaxe para que possamos olhar...
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=NothingO codigo veio tudo bagunçado.
Tem como vc colocar em uma tabela fisica antes de fazer o select?
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;Uma duvida, qual a versao do SQL?
2005
Achei que fosse SQL2000, por isso perguntei.
Seria possivel colocar estes txt em uma tabela fisica e depois fazer o pivot?
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?
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