Sql - realziar duas count

SQL Server

30/07/2019

Pessoal, Boa tarde.

Preciso realizar duas count. Por favor poderia me ajudar?

cheguei a fazer dessa forma

select city, count(city) as ''anuncio por cidade'', neighborhood, count(neighborhood) as ''anuncio por bairro'' from tb_listings
group by city, neighborhood

Porém me trás duas tabelas mas a ultima coluna "Anuncio por barro trás o mesmo resultado que "anuncio por cidade"

---

Tabela foi feita assim

CREATE TABLE tb_listings (
"advertiser_id" varchar,
"listing_id" varchar,
"portal" varchar,
"city" varchar,
"neighborhood" varchar);
Guilherme Alves

Guilherme Alves

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

30/07/2019

Da forma como foi feito, o resultado das duas colunas será igual, visto que você agrupou pelos 2 campos que quer contar.

Publique alguns registros e dê um exemplo de como espera o resultado da consulta.
GOSTEI 0
Guilherme Alves

Guilherme Alves

30/07/2019

Da forma como foi feito, o resultado das duas colunas será igual, visto que você agrupou pelos 2 campos que quer contar.

Publique alguns registros e dê um exemplo de como espera o resultado da consulta.



Preciso saber qual a proporção de anúncios que um determinado bairro tem em relação à cidade em que está situado, A query deverá retornar: a cidade, o bairro, o total de anúncios do bairro, o total de anúncios da cidade e a proporção em porcentagem.

"listing_id" código do anuncio (Aqui eu usei count, para saber quantidade de anúncios)
"city" cidade
"neighborhood" bairro
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/07/2019

veja se isso te ajuda:
select
	tab.*,
	(('anuncios por bairro' / 'anuncios por cidade') * 100) as 'participacao do bairro'
from (
	select
		tl.city, tl.neighborhood, count(distinct tl.advertiser_id) as 'anuncios por bairro',
		(	select count(distinct tl.advertiser_id)
			from tb_listings tl2
			where tl2.city = tl.city	) as 'anuncios por cidade'
	from tb_listings tl
	group by tl.city, tl.neighborhood
) tab

pode ter algum erro de sintaxe, mas a base é essa aí.
GOSTEI 0
Guilherme Alves

Guilherme Alves

30/07/2019

veja se isso te ajuda:
select
	tab.*,
	(('anuncios por bairro' / 'anuncios por cidade') * 100) as 'participacao do bairro'
from (
	select
		tl.city, tl.neighborhood, count(distinct tl.advertiser_id) as 'anuncios por bairro',
		(	select count(distinct tl.advertiser_id)
			from tb_listings tl2
			where tl2.city = tl.city	) as 'anuncios por cidade'
	from tb_listings tl
	group by tl.city, tl.neighborhood
) tab

pode ter algum erro de sintaxe, mas a base é essa aí.



Perfeito Emerson, eu cheguei algo semelhante e logo em seguida vc enviou sua resposta. Obrigado!

O problema agora é na divisão, está dando
"O tipo de dados de operando varchar é inválido para o operador divide."
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/07/2019


na consulta que você criou ou na que eu te passei?
GOSTEI 0
Guilherme Alves

Guilherme Alves

30/07/2019


na consulta que você criou ou na que eu te passei?


nas duas.

Fiz igual a você
GOSTEI 0
Alex Lekao

Alex Lekao

30/07/2019

Olá, bom dia!!

Vou me intrometer. rsrsr

Verificou se um dos dois esta retornando NULL e isso não está interferindo? ou o valor do divisor está zero?

Espero ter ajudado.
GOSTEI 0
Guilherme Alves

Guilherme Alves

30/07/2019

Olá, bom dia!!

Vou me intrometer. rsrsr

Verificou se um dos dois esta retornando NULL e isso não está interferindo? ou o valor do divisor está zero?

Espero ter ajudado.


Na linha da visão eu cheguei a isso
(select count(neighborhood) / count(city)from tb_listings)
Mas estou tendo retorno "1"
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/07/2019

veja assim (a única mudança é a nomenclatura dos campos):
select
    tab.*,
    ((anuncios_por_bairro / anuncios_por_cidade) * 100) as participacao_do_bairro
from (
    select
        tl.city, tl.neighborhood, count(distinct tl.advertiser_id) as anuncios_por_bairro,
        (   select count(distinct tl.advertiser_id)
            from tb_listings tl2
            where tl2.city = tl.city    ) as anuncios_por_cidade
    from tb_listings tl
    group by tl.city, tl.neighborhood
) tab

se ainda não der o resultado esperado, publique alguns registros da tabela pra que seja possível fazer um teste aqui com dados reais, por que fazer "a olho" é bem complicado...
GOSTEI 0
Guilherme Alves

Guilherme Alves

30/07/2019

veja assim (a única mudança é a nomenclatura dos campos):
select
    tab.*,
    ((anuncios_por_bairro / anuncios_por_cidade) * 100) as participacao_do_bairro
from (
    select
        tl.city, tl.neighborhood, count(distinct tl.advertiser_id) as anuncios_por_bairro,
        (   select count(distinct tl.advertiser_id)
            from tb_listings tl2
            where tl2.city = tl.city    ) as anuncios_por_cidade
    from tb_listings tl
    group by tl.city, tl.neighborhood
) tab

se ainda não der o resultado esperado, publique alguns registros da tabela pra que seja possível fazer um teste aqui com dados reais, por que fazer "a olho" é bem complicado...


link do fiddle para ajudar a enteder
http://sqlfiddle.com/#!15/1d25e/316

a porcentagem (ultima coluna) está dando sempre 1
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

30/07/2019

tente com esta instrução:
select
    tab.*,
    (((anuncios_por_bairro * 1.00000) / anuncios_por_cidade) * 100) as perc_participacao_do_bairro
from (
    select
        tl.city, tl.neighborhood, count(distinct tl.advertiser_id) as anuncios_por_bairro,
        (   select count(distinct tl2.advertiser_id)
            from tb_listings tl2
            where tl2.city = tl.city    ) as anuncios_por_cidade
    from tb_listings tl
    group by tl.city, tl.neighborhood
) tab

que é diferente daquela que você colocou no fiddle

http://sqlfiddle.com/#!15/1d25e/356
GOSTEI 0
Guilherme Alves

Guilherme Alves

30/07/2019

tente com esta instrução:
select
    tab.*,
    (((anuncios_por_bairro * 1.00000) / anuncios_por_cidade) * 100) as perc_participacao_do_bairro
from (
    select
        tl.city, tl.neighborhood, count(distinct tl.advertiser_id) as anuncios_por_bairro,
        (   select count(distinct tl2.advertiser_id)
            from tb_listings tl2
            where tl2.city = tl.city    ) as anuncios_por_cidade
    from tb_listings tl
    group by tl.city, tl.neighborhood
) tab

que é diferente daquela que você colocou no fiddle

http://sqlfiddle.com/#!15/1d25e/356


Deu certo da sua forma.

Sabe dizer o pq o que eu fiz não estava indo?

Muito obrigado, ajudou muito
GOSTEI 0
POSTAR