Juntar valores

(leandroauler) #1

Tenho duas tabelas:

Pass => grava dados de utlização de cartoes
Pass100 => grava dados de venda a bordo => 100 - VENDA BORDO

Tenho os seguintes selects:

SELECT  
DISTINCT (Aplicacao) AS COD,
COUNT( Idaut ) AS PASS,
Carro
FROM Pass
WHERE 
Idguia = 63026

Resultado:

COD    PASS   CARRO
100      10      48004
400      130    48004
450      40      48004
700      5        48004
911      30      48004
SELECT  
DISTINCT (Aplicacao) AS COD,
COUNT( Idaut ) AS PASS,
Carro
FROM Pass100
WHERE 
Idguia = 63026

Resultado:

COD    PASS   CARRO
100      172      48004

Quero juntar os dois resultados:

COD    PASS   CARRO
100      182      48004
400      130    48004
450      40      48004
700      5        48004
911      30      48004

Tem como fazer?

(Diogo Toscano) #2

Pode, mas depende da sua logica …

No caso voce esta dando o distinct pra pegar os unicos … no caso de do pass vier o codigo 100 e no pass100 tambem vier o codigo 100 do seu exemplo … quem prevalece?

Pois quando voce mostrou:

COD    PASS   CARRO
100      10      48004
400      130    48004
450      40      48004
700      5        48004
911      30      48004

e:

COD    PASS   CARRO
100      172      48004

E como voce falou união, o resultado deveria ser:

COD    PASS   CARRO
100      172      48004
100      10      48004
400      130    48004
450      40      48004
700      5        48004
911      30      48004

Mas voce colocou como resultado:

COD PASS CARRO 100 182 48004 400 130 48004 450 40 48004 700 5 48004 911 30 48004
E ai fiquei sem entender de onde veio o 182 :-p

Ainda acho que o que voce mais precisa melhor eh em banco de dados.
Com UNION voce resolve isso ai :-p
Talvez nao precise nem de union … se o codigo 100 é pra prevalecer o de pass100 … voce pode fazer um switch e se o codigo for 100, pegar o valor da tabela pass100 …

Depende da sua logica.

(leandroauler) #3

E como colocaria esse switch no select?

(leandroauler) #4

DIogo,

Fiz o UNION mas tenho cod 100 nas duas tabelas…

Queria somar a quantidade de cod 100 da tabela Pass com os cod 100 da tabela Pass100…

(SELECT DISTINCT(Aplicacao) AS APL, COUNT(Idaut) AS Pass, IdGuia, Carro, valor, turno FROM pass WHERE Idguia = 63206 GROUP BY Aplicacao) UNION (SELECT DISTINCT(gp.Aplicacao) AS APL, COUNT(gp.Idaut) AS Pass, gp.IdGuia, gp.Carro, gp.valor, gp.turno FROM pass100 gp WHERE gp.Idguia = 63206 GROUP BY Aplicacao)

Resultado:

“APL” “Pass” “IdGuia” “Carro” “valor” “turno”
“100” 172 63206 “48004” “220” “1”
“100” 10 63206 “48004” “220” “1”
“400” 133 63206 “48004” “220” “1”
“450” 14 63206 “48004” “0” “1”
“600” 3 63206 “48004” “0” “1”
“610” 4 63206 “48004” “0” “1”
“611” 1 63206 “48004” “0” “1”
“700” 3 63206 “48004” “0” “1”
“800” 36 63206 “48004” “0” “1”
“900” 15 63206 “48004” “0” “1”
“910” 6 63206 “48004” “0” “1”

(Diogo Toscano) #5

Vou te dar so a ideia …

Seu codigo vai ser o original:

SELECT
DISTINCT (Aplicacao) AS COD,
COUNT( Idaut ) AS PASS,
Carro
FROM Pass
WHERE
Idguia = 63026

E voce vai fazer um switch case (tipo um if) de se o codigo for diferente de 100, retorna o proprio campo pass(count idaut), se o codigo for 100 voce vai somar o count com um select na tabela Pass100

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

Essa é a logica. Tem varias formas de fazer isso … dei apenas 1 exemplo.

Ainda afirmo que o ideal eh voce participar de um forum de banco. Seu problema ate agora … é com logica no banco.

(Raphael Godoi) #6

Estou Quse dormindo aqui, vê se isso pode lhe ajudar… Abração!
Isso é um recurso técnico kkkkk

SELECT *
FROM   (

/*AS APLICAÇÕES 100 NÃO ENTRAM NESTE SELECT*/
SELECT DISTINCT(Aplicacao) AS APL, 
       COUNT(Idaut) AS Pass, 
       IdGuia,
       Carro, 
       valor, 
       turno
FROM   pass
WHERE  Idguia = 63206
AND    Aplicacao <> 100
GROUP BY Aplicacao

UNION

/*AS APLICAÇÕES 100 NÃO ENTRAM NESTE SELECT*/
SELECT DISTINCT(gp.Aplicacao) AS APL, 
        COUNT(gp.Idaut) AS Pass,
        gp.IdGuia,
        gp.Carro,
        gp.valor,
        gp.turno
FROM    pass100 gp
WHERE   gp.Idguia = 63206
AND     gp.Aplicacao <> 100
GROUP BY gp.Aplicacao

UNION

/*AQUI ENTRAM AS APLICAÇÕES 100, SOMENTE 100 (SOMANDO OS VALORES)*/
SELECT x.APL,
       SUM(Pass) Pass,
       x.IdGuia,
       x.Carro,
       x.valor,
       x.turno
FROM   ( SELECT DISTINCT(gp.Aplicacao) AS APL, 
                COUNT(gp.Idaut) AS Pass,
                gp.IdGuia,
                gp.Carro,
                gp.valor,
                gp.turno
           FROM pass100 gp
          WHERE gp.Idguia = 63206
            AND gp.Aplicacao       = 100
           GROUP BY Aplicacao) x
GROUP BY x.APL,
         x.IdGuia,
         x.Carro,
         x.valor,
         x.turno
) w
ORDER BY w.APL
(Diogo Toscano) #7

como diz, sql eh uma arte, da pra fazer de tudo, é igual a javascript. da pra fazer tudo com jeitinho :-p

(Raphael Godoi) #8

Verdade mesmo Diogo, por isso adoro SQL…
Leandro funcionou???

:slight_smile:

(leandroauler) #9

Rafael,

#1064 - Você tem um erro de sintaxe no seu SQL próximo a ‘OREDR BY w.APL’ na linha 55

(Raphael Godoi) #10

Leandro foi corrigido, o erro ocorreu pq fiz direto aqui pelo forúm não criei as tabelas para fazer os teste, mas então funcionou… fora este “errinho” ???

(leandroauler) #11

Nao funcionou deu esse erro…

Vou verificar com calma e te falo…

(Raphael Godoi) #12

Leandro era um erro de grafia escrevi errado ORDER BY, se você testar agora deve funcionar…

Abraço!!!

(leandroauler) #13

Rafael,

Desculpa a demora, pois são várias consultas ao mesmo tempo…

O select está funcionando, porém não executa a soma dos codigo 100 das tabelas PASS e PASS100.

[code]SELECT *
FROM (

/AS APLICAÇÕES 100 NÃO ENTRAM NESTE SELECT/
SELECT DISTINCT(Aplicacao) AS APL,
COUNT(Idaut) AS Pass,
IdGuia,
Carro,
valor,
turno
FROM guiaspassageiros
WHERE Idguia = 534
AND Aplicacao <> 100
GROUP BY Aplicacao

UNION

/AS APLICAÇÕES 100 NÃO ENTRAM NESTE SELECT/
SELECT DISTINCT(gp.Aplicacao) AS APL,
COUNT(gp.Idaut) AS Pass,
gp.IdGuia,
gp.Carro,
gp.valor,
gp.turno
FROM guiaspassageiros100 gp
WHERE gp.Idguia = 534
AND gp.Aplicacao <> 100
GROUP BY gp.Aplicacao

UNION

/AQUI ENTRAM AS APLICAÇÕES 100, SOMENTE 100 (SOMANDO OS VALORES)/
SELECT x.APL,
SUM(Pass) Pass,
x.IdGuia,
x.Carro,
x.valor,
x.turno
FROM ( SELECT DISTINCT(gp.Aplicacao) AS APL,
COUNT(gp.Idaut) AS Pass,
gp.IdGuia,
gp.Carro,
gp.valor,
gp.turno
FROM guiaspassageiros100 gp
WHERE gp.Idguia = 534
AND gp.Aplicacao = 100
GROUP BY Aplicacao) x
GROUP BY x.APL,
x.IdGuia,
x.Carro,
x.valor,
x.turno
) w
ORDER BY w.APL
[/code]

Resultado só o codigo 100 da tabela pass100:

"100";174;534;"48141";"235";"1"
"400";2;534;"48141";"0";"1"
"600";4;534;"48141";"0";"1"
"610";1;534;"48141";"0";"1"
"800";41;534;"48141";"0";"1"
"900";4;534;"48141";"0";"1"
"910";3;534;"48141";"0";"1"