Agrupar por duas colunas diferentes

22 views
Skip to first unread message

Thamyris Campos

unread,
Apr 20, 2014, 6:30:26 PM4/20/14
to web2py-us...@googlegroups.com
Olá boa noite galera. Gostaria de tirar uma duvida

desejo fazer o seguinte select

select c.Cidade, a.area, count(v.idArea) from vagasemprego v, Area a, Cidade c where c.idCidade=v.idCidade and a.idArea=v.idArea  group by v.idCidade,v.idArea

a estrutura da tabela é a seguinte : 

CREATE TABLE vagasemprego (idVaga INTEGER PRIMARY KEY AUTOINCREMENT,
                         idLink INTEGER,
                         idCidade INTEGER,
                         IdArea INTEGER,
                         tituloVaga TEXT,
                         linkVaga TEXT,
                         descricao TEXT,
                         data INTEGER,
                         FOREIGN KEY (idCidade) REFERENCES Cidade (idCidade)
                         FOREIGN KEY (IdArea) REFERENCES Area (idArea)
)

Como faço para utilizar o group by no web2py utilizando dois campos diferentes ? Já olhei o manual mas lá eles agrupam utilizando somente um campo.
Será que alguém pode me ajudar ? Valeu

Diogo Munaro

unread,
Apr 20, 2014, 7:18:59 PM4/20/14
to web2py-us...@googlegroups.com
db(db.tabela).select(db.tabela.campo,groupby=[db.tabela.campo1,db.tabela.campo2])



--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo quot;web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Thamyris Campos

unread,
Apr 20, 2014, 8:01:46 PM4/20/14
to web2py-us...@googlegroups.com


Diogo, isso realmente funciona mas agora minha duvida é a seguinte.

eu estou enviando um dos campos que quero agrupar por post então ficou da seguinte maneira

        lists = db(db.vagasemprego.idCidade==request.vars.city).select(db.vagasemprego.ALL, count, groupby = [request.vars.city,db.vagasemprego.idArea])

porém aparece um erro informando que :

TypeError: unsupported operand type(s) for |: 'str' and 'Field'

Como posso resolver isso ?

Diogo Munaro

unread,
Apr 20, 2014, 9:31:47 PM4/20/14
to web2py-us...@googlegroups.com
Oi Thamyris, seu group by não parece ter muito sentido...

Group by precisa ser feito por um campo de uma tabela, não por uma variável aleatória. Acho que seria assim:

lists = db(db.vagasemprego.idCidade == request.vars.city).select(db.vagasemprego.ALL, count, groupby = [db.vagasemprego.idCidade,db.vagasemprego.idArea])

Seria isso?

Ps: ah! Uma dica... Tente não ficar usando muito letras maiúsculas... Prefira por separar os nomes compostos por _ Ex: db.vagas_emprego.id_cidade ou db.vagas_emprego.cidade_id (acho que o web2py converte maiúsculas para minusculas... algo assim)

;)



--

Thamyris Campos

unread,
Apr 20, 2014, 9:58:36 PM4/20/14
to web2py-us...@googlegroups.com


Diogo, obrigada era isso mesmo, acabei por deixar o meu group by assim:

lists = db((db.vagasemprego.idCidade==request.vars.city) & (db.vagasemprego.idArea == db.Area.idArea)).select(db.Area.area, count, groupby = [db.vagasemprego.idCidade,db.vagasemprego.idArea], limitby=(0,5), orderby=~count)

Vou tratar de modificar isso pode deixar.

O que estou achando estranho agora é que quero pegar somente os campos area e o resultado do count, dentro da view. Mas quando tento retornar, tenho o resultado da seguinte forma

<Row {'_extra': {'COUNT(vagasemprego.idArea)': 130L}, 'Area': {'area': 'Comercial, Vendas'}}>

Já trabalhei com resultados dentro da view, e para pegar somente 'Comercial, Vendas' por exemplo fazia assim :

{{for resultado in lists:}}
    <tr>
        <td>
            {{=resultado.area}}
       </td>
    </tr>
{{pass}}

mas quando faço isso da um erro : 

AttributeError: 'Row' object has no attribute 'area'

Não entendo porque está dando isso, não faz sentido para mim. Será que consegue me ajudar ?





Diogo Munaro

unread,
Apr 21, 2014, 1:24:08 AM4/21/14
to web2py-us...@googlegroups.com
Então precisa fazer sentido... Vamos lá:

Conforme entendi

{{for resultado in lists:}}
    <tr>
        <td>
            {{=resultado}}
       </td>
    </tr>
{{pass}}

retorna um resultado assim:


<Row {'_extra': {'COUNT(vagasemprego.idArea)': 130L}, 'Area': {'area': 'Comercial, Vendas'}}>

Então se você colocar resultado.area seria o mesmo de colocar resultado['area'], pois o objeto Storage do web2py permite pegar as chaves das duas formas. Não existe a chave 'area' dentro dessa row. O que existe aí é a chave '_extra' e a chave 'Area'.

Para pegar o elemento precisa fazer o caminho até ele, ou seja, se quiser pegar o count precisa fazer:


{{for resultado in lists:}}
    <tr>
        <td>
            {{=resultado['_extra']['COUNT(vagasemprego.idArea)']}}
       </td>
    </tr>
{{pass}}

Para pegar a área seria:


{{for resultado in lists:}}
    <tr>
        <td>
            {{=resultado['Area'][area']}} # ou {{=resultado.Area.area}}
       </td>
    </tr>
{{pass}}

Pode aproveitar e pegar os 2 no mesmo for se quiser:


{{for resultado in lists:}}
    <tr>
        <td>
            {{=resultado['Area'][area']}} # ou {{=resultado.Area.area}}
            {{=resultado['_extra']['COUNT(vagasemprego.idArea)']}}
       </td>
    </tr>
{{pass}}

Espero que dê certo e que tenha entendido!

Abraços!


Reply all
Reply to author
Forward
0 new messages