Criando coluna com valor ¬ de outras colunas...COMO?

08/10/2008

0

olá amigos...
venho novamente solicitar
ajuda de vcs quanto a uma dúvida em um select...
tenho o seguinte select
_____________________________________________________________
SELECT LinhaT,DESCRICAO,QTD_Aces,QTD_Integ
FROM
(SELECT
(ITUR.LINHA)LinhaT,
(ln.nome) DESCRICAO,
(count(*))QTD_Aces
FROM
Cartao_Transacao ICTR,
Cartao_Acesso ICTA,
Turnos ITUR,
linha LN
WHERE ITUR.Data >= :P_Data_I
AND ITUR.Data <= :P_Data_F
AND ICTR.Cod_Num_Serie = ICTA.Cod_Num_Serie
AND ICTA.Transacao = ICTR.Transacao
AND ITUR.Cod_Turno = ICTA.Cod_Turno
AND ICTR.Produto not in (80,90)
AND LN.cod_Linha = ITUR.LINHA
group by ITUR.LINHA,LN.nome
)TOTAL,
(SELECT
(ITUR.LINHA)L_INTEG,
(ln.nome) DESCRICAOI,
(count(*))QTD_Integ
FROM
Cartao_Transacao ICTR,
Cartao_Acesso ICTA,
Turnos ITUR,
linha LN
WHERE ITUR.Data >= :P_Data_I
AND ITUR.Data <= :P_Data_F
AND ICTR.Tarifa >= 129
AND ICTR.Cod_Num_Serie = ICTA.Cod_Num_Serie
AND ICTA.Transacao = ICTR.Transacao
AND ITUR.Cod_Turno = ICTA.Cod_Turno
AND LN.cod_Linha = ITUR.LINHA
group by ITUR.LINHA,ln.nome
)INTEGRACAO
WHERE L_INTEG = LINHAT
ORDER BY LINHAT
-------------------------------------------------------------------------------------
este select retorna os valores da seguinte forma
-------------------------------------------------------------------------------------
linhat_|_descricao_|_qtd_acess_|_atq_integ_|
1____|_A________|_100______|_10_______|
2____|_B________|_200______|_10_______|
3____|_C________|_300______|_30_______|
-------------------------------------------------------------------------------------
acontece que eu preciso gerar um campo com o percentual desta turma toda, e não queria fazer isso via programa.
| ((QTD_Integ/QTD_Aces)* 100)perc
Por favor ajude-me a gerar um código para gerar a coluna percentual ai dentro. Queria que ele fica-se mais o menos desta forma
linhat_|_descricao_|_qtd_acess_|_atq_integ_|_Perc_|
1____|_A________|_100______|_10_______|_10__|
2____|_B________|_200______|_10_______|_5___|
3____|_C________|_300______|_150______|_50__|

Assim consigo deixar tudo dentro do banco
agradeço a todos desde já


Eduardo-v-a

Eduardo-v-a

Responder

Posts

08/10/2008

Emerson Nascimento

tente assim:
SELECT
  LinhaT, DESCRICAO,
  QTD_Aces, QTD_Integ,
  ((QTD_Integ / QTD_Aces) * 100) Perc 
FROM
  (SELECT
     (ITUR.LINHA)LinhaT,
     (ln.nome) DESCRICAO,
     (count(*))QTD_Aces
   FROM
     Cartao_Transacao ICTR,
     Cartao_Acesso ICTA,
     Turnos ITUR,
     linha LN
   WHERE ITUR.Data >= :P_Data_I
     AND ITUR.Data <= :P_Data_F
     AND ICTR.Cod_Num_Serie = ICTA.Cod_Num_Serie
     AND ICTA.Transacao = ICTR.Transacao
     AND ITUR.Cod_Turno = ICTA.Cod_Turno
     AND ICTR.Produto not in (80,90)
     AND LN.cod_Linha = ITUR.LINHA
   group by ITUR.LINHA,LN.nome
  ) TOTAL,

  (SELECT
     (ITUR.LINHA)L_INTEG,
     (ln.nome) DESCRICAOI,
     (count(*))QTD_Integ
   FROM
     Cartao_Transacao ICTR,
     Cartao_Acesso ICTA,
     Turnos ITUR,
     linha LN
   WHERE ITUR.Data >= :P_Data_I
     AND ITUR.Data <= :P_Data_F
     AND ICTR.Tarifa >= 129
     AND ICTR.Cod_Num_Serie = ICTA.Cod_Num_Serie
     AND ICTA.Transacao = ICTR.Transacao
     AND ITUR.Cod_Turno = ICTA.Cod_Turno
     AND LN.cod_Linha = ITUR.LINHA
   group by ITUR.LINHA,ln.nome
  ) INTEGRACAO
WHERE
  L_INTEG = LINHAT
ORDER BY
  LINHAT


ou assim (com uma única instrução):
SELECT
  *,
  ((QTD_Integ / QTD_Aces) * 100) Perc
FROM
  (SELECT
     ITUR.LINHA LinhaT,
     ln.nome DESCRICAO,
     sum(
       (case when ICTR.Produto not in (80,90)
             then 1
             else 0
        end) QTD_Aces,
     sum(
       (case when ICTR.Tarifa >= 129
             then 1
             else 0
        end)
     ) QTD_Integ
   FROM
     Cartao_Transacao ICTR
   inner join
     Cartao_Acesso ICTA on (ICTA.Transacao = ICTR.Transacao
       and ICTA.Cod_Num_Serie = ICTR.Cod_Num_Serie)
   inner join
     Turnos ITUR on (ITUR.Cod_Turno = ICTA.Cod_Turno)
   inner join
     linha LN on (LN.cod_Linha = ITUR.LINHA)
   WHERE
     ITUR.Data >= :P_Data_I AND ITUR.Data <= :P_Data_F
   group by
     ITUR.LINHA, LN.nome
  ) TABELA
ORDER BY
  LINHAT



Responder

09/10/2008

Emerson Nascimento

SELECT
  LinhaT, DESCRICAO,
  QTD_Aces, QTD_Integ,
  ((cast(QTD_Integ as numeric(10,3)) / cast(QTD_Aces as numeric(10,3))) * 100.000) Perc
FROM
  (SELECT
     (ITUR.LINHA)LinhaT,
     (ln.nome) DESCRICAO,
     (count(*))QTD_Aces
   FROM
     Cartao_Transacao ICTR,
     Cartao_Acesso ICTA,
     Turnos ITUR,
     linha LN
   WHERE ITUR.Data >= :P_Data_I
     AND ITUR.Data <= :P_Data_F
     AND ICTR.Cod_Num_Serie = ICTA.Cod_Num_Serie
     AND ICTA.Transacao = ICTR.Transacao
     AND ITUR.Cod_Turno = ICTA.Cod_Turno
     AND ICTR.Produto not in (80,90)
     AND LN.cod_Linha = ITUR.LINHA
   group by ITUR.LINHA,LN.nome
  ) TOTAL,

  (SELECT
     (ITUR.LINHA)L_INTEG,
     (ln.nome) DESCRICAOI,
     (count(*))QTD_Integ
   FROM
     Cartao_Transacao ICTR,
     Cartao_Acesso ICTA,
     Turnos ITUR,
     linha LN
   WHERE ITUR.Data >= :P_Data_I
     AND ITUR.Data <= :P_Data_F
     AND ICTR.Tarifa >= 129
     AND ICTR.Cod_Num_Serie = ICTA.Cod_Num_Serie
     AND ICTA.Transacao = ICTR.Transacao
     AND ITUR.Cod_Turno = ICTA.Cod_Turno
     AND LN.cod_Linha = ITUR.LINHA
   group by ITUR.LINHA,ln.nome
  ) INTEGRACAO
WHERE
  L_INTEG = LINHAT
ORDER BY
  LINHAT



Responder

09/10/2008

Eduardo-v-a

cara ele rodou certinho aqui
foi
´CTRL+C´ e ´CTRL+V´
voltou os valores certinhos
só acrescentei um ROUND com ,2 para arredondar os percentuais
só não consegui tirar o monte de zeros que ele deixou
mas fechou certinho
meu relatório está pronto

MUITO OBRIGADO
EMERSON
tiro certeiro como sempre


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar