Ir para conteúdo

POWERED BY:

Arquivado

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

LordFusion

[Resolvido] Soma entre selects

Recommended Posts

Olá pessoal, estou tentando fazer a soma de um resultado e depois agrupar essa soma por outro campo. Mas está dando o seguinte erro:

#1248 - Every derived table must have its own alias

 

Abaixo meu select.

 

SELECT origem, SUM(valor) FROM (

SELECT calldate AS data, src AS origem, dst AS destino, SEC_TO_TIME(billsec) AS duracao,

(SELECT CASE WHEN billsec >= 1 AND billsec <= 30 THEN ROUND(0.045,2) WHEN billsec > 30 AND (billsec%6 = 0) THEN ROUND((billsec/6)*0.009,2) ELSE ROUND(FLOOR((billsec/6)+1)*0.009,2) END) AS valor

FROM cdr

WHERE DATE_FORMAT(calldate, '%Y-%m-%d')

BETWEEN '2010-02-01'

AND '2010-02-28'

AND disposition = 'ANS'

AND channel LIKE 'S%'

AND dstchannel LIKE 'D%'

AND dcontext = 'route'

AND billsec >= 3

AND (dst LIKE '112'

OR dst LIKE '113'

OR dst LIKE '114'

OR dst LIKE '115')

GROUP BY origem);

 

Se eu rodar o SELECT que está em azul, funciona normalmente, no entanto quero somar todos o valores de determinada origem. Ai estou me perdendo.

 

Desde já agradeço a ajuda de todos.

 

Muito Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Este erro é porque você tá colocando um SELECT como se fosse uma tabela e mesmo que funcionasse cadê o campo valor no SELECT azul?

Já tentou fazer com JOIN???

 

Passa aí o que você está querendo, pois ficou confuso o seu select. Se você está querendo o origem e o total do valor, porque no select azul você está retornando calldate,dst,billsec, sendo que você não precisa deles? Explica melhor a sua lógica aí!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Every derived table must have its own alias -> Toda tabela derivada deve ser seu proprio nome.

 

E ao camarada Shrek-BH

 

'Este erro é porque você tá colocando um SELECT como se fosse uma tabela e mesmo que funcionasse cadê o campo valor no SELECT azul?'

 

Eh possivel e funciona, e nao eh sao soh eh possivel e funciona como eh mto comun de ser usado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

GROUP BY origem)z;

 

Every derived table must have its own alias -> Toda tabela derivada deve ser seu proprio nome.

 

Olá giesta, tentei o que você passou e não deu certo. Tentei ainda adicionar "GROUP BY origem) AS z;" ou "GROUP BY origem) AS valor;" todos retornam o erro abaixo.

 

#1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause

 

Este erro é porque você tá colocando um SELECT como se fosse uma tabela e mesmo que funcionasse cadê o campo valor no SELECT azul?Já tentou fazer com JOIN???Passa aí o que você está querendo, pois ficou confuso o seu select. Se você está querendo o origem e o total do valor, porque no select azul você está retornando calldate,dst,billsec, sendo que você não precisa deles? Explica melhor a sua lógica aí!

 

O campo valor no SELECT azul esta aqui.

 

"(SELECT CASE WHEN billsec >= 1 AND billsec <= 30 THEN ROUND(0.045,2) WHEN billsec > 30 AND (billsec%6 = 0) THEN ROUND((billsec/6)*0.009,2) ELSE ROUND(FLOOR((billsec/6)+1)*0.009,2) END) AS valor"

 

O que quero fazer é seguinte. O SELECT abaixo. (que estava em azul no primeiro post)

 

SELECT calldate AS data, src AS origem, dst AS destino, SEC_TO_TIME(billsec) AS duracao,

(SELECT CASE WHEN billsec >= 1 AND billsec <= 30 THEN ROUND(0.045,2) WHEN billsec > 30 AND (billsec%6 = 0) THEN ROUND((billsec/6)*0.009,2) ELSE ROUND(FLOOR((billsec/6)+1)*0.009,2) END) AS valor

FROM cdr

WHERE DATE_FORMAT(calldate, '%Y-%m-%d')

BETWEEN '2010-02-01'

AND '2010-02-28'

AND disposition = 'ANS'

AND channel LIKE 'S%'

AND dstchannel LIKE 'D%'

AND dcontext = 'route'

AND billsec >= 3

AND (dst LIKE '112'

OR dst LIKE '113'

OR dst LIKE '114'

OR dst LIKE '115');

 

Retorna os seguinte valores:

 

data | origem | destino duracao | valor

2010-02-10 | 57531401 | 55112 | 00:00:31 | 0.05

2010-02-10 | 57531401 | 55112 | 00:00:25 | 0.05

2010-02-10 | 57531401 | 55112 | 00:00:06 | 0.05

2010-02-25 | 12661502 | 55112 | 00:01:39 | 0.15

2010-02-18 | 57531402 | 55112 | 00:00:36 | 0.05

2010-02-12 | 57531403 | 55112 | 00:00:17 | 0.05

2010-02-08 | 10491074 | 55112 | 00:02:09 | 0.20

2010-02-08 | 10491074 | 55112 | 00:05:24 | 0.49

2010-02-08 | 10491074 | 55112 | 00:03:04 | 0.28

 

O que estou tentando fazer com o SELECT vermelho é somar e agrupar os valores que possuem a mesma origem, para ficar assim:

 

data | origem | destino duracao | valor

2010-02-10 | 57531401 | 55112 | 00:00:31 | 0.15

2010-02-25 | 12661502 | 55112 | 00:01:39 | 0.20

2010-02-12 | 57531403 | 55112 | 00:00:17 | 0.05

2010-02-08 | 10491074 | 55112 | 00:02:09 | 0.97

 

Não sei se ficou claro agora. Bom ainda estou aprendendo, então as vezes dou umas escorregadas.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT origem, SUM(valor) FROM

(

SELECT

calldate AS data,

src AS origem,

dst AS destino,

SEC_TO_TIME(billsec) AS duracao,

(SELECT CASE

WHEN billsec >= 1 AND billsec <= 30 THEN ROUND(0.045,2)

WHEN billsec > 30 AND (billsec%6 = 0) THEN ROUND((billsec/6)*0.009,2)

ELSE ROUND(FLOOR((billsec/6)+1)*0.009,2) END)

AS valor

FROM cdr

WHERE DATE_FORMAT(calldate, '%Y%m%d')BETWEEN '20100201' AND '20100228'

AND disposition = 'ANS'

AND channel LIKE 'S%'

AND dstchannel LIKE 'D%'

AND dcontext = 'route'

AND billsec >= 3

AND (dst LIKE '112'OR dst LIKE '113'OR dst LIKE '114'OR dst LIKE '115')

)z

GROUP BY origem

;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Every derived table must have its own alias -> Toda tabela derivada deve ser seu proprio nome.

 

E ao camarada Shrek-BH

 

'Este erro é porque você tá colocando um SELECT como se fosse uma tabela e mesmo que funcionasse cadê o campo valor no SELECT azul?'

 

Eh possivel e funciona, e nao eh sao soh eh possivel e funciona como eh mto comun de ser usado.

 

Vivendo e aprendendo, mas tentei aqui e deu o mesmo erro que o Lord informou "#1248 - Every derived table must have its own alias".

Só para teste, fiz: SELECT cod_usuario FROM (SELECT cod_usuario FROM usuarios WHERE usuario like "%shrek%");

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valew Giesta pela dica. Consegui executar o script. Faltou colocar o AS xxxxx após o parenteses.

Lord, foi mal. 1º porque realmente não sabia que era possível e depois porque não tinha visto o AS valor.

 

Agora só uma dúvida, se não usará os campos calldate AS data, dst AS destino e SEC_TO_TIME(billsec) AS duracao, porque colocá-los na subquery?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valew Giesta pela dica. Consegui executar o script. Faltou colocar o AS xxxxx após o parenteses.Lord, foi mal. 1º porque realmente não sabia que era possível e depois porque não tinha visto o AS valor.Agora só uma dúvida, se não usará os campos calldate AS data, dst AS destino e SEC_TO_TIME(billsec) AS duracao, porque colocá-los na subquery?

 

Sherek-BH eu vou usar sim, mas primeiro queria conseguir fazer o select. E com a dica do giesta, eu consegui. Muito obrigado.

 

Agora fiquei com uma dúvida, porque o "z" eu poderia usar qualquer outra coisa? giesta se puder me explicar eu agradeço.

 

0FF. Cara vi a foto do Alf e lembrei do meu irmão a gente chamava ele de Alf por causa do narigão, essa série era muito comédia, eu me rachava de rir.

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.