Ir para conteúdo

Arquivado

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

jamersondr

Incluir todas as cidades numa where.

Recommended Posts

Estou com uma dúvida, montando um relatório onde na where solicito a cidade passando um parâmetro, ficando dessa forma a consulta:

.....

WHERE cidade = ${parametro_cidade}

......

 

Para passar o parâmetro tenho um seletor que lista todas as cidades disponíveis. Minha dúvida é: como faço para que nessa where eu possa passar o parâmetro "Todas"? Trazendo "Todas" o resultado da consulta seria o valor de todas as cidades juntas, ao invés de somente de uma.

 

Agradeço a atenção!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente

 

 

WHERE cidade = coalece(${parametro_cidade},cidade)

http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm#SQLRF00617

Não entendi como faria isso Motta, porque na tabela fato não existe a cidade "Todas", na query do seletor eu fiz utilizei o coalesce para incluir o "Todas", mas na query do relatório como na where vai interpretar? Abaixo estão as duas query:

--QUERY SELETOR
SELECT COALESCE(NULL, 'Todas') AS cidade
FROM
dim.dim_cidade
INNER JOIN dim.fact_cvp ON dim.fact_cvp.id_cidade = dim.dim_cidade.id_cidade

UNION

SELECT dim.dim_cidade.cidade AS cidade
FROM
dim.dim_cidade
INNER JOIN dim.fact_cvp ON dim.fact_cvp.id_cidade = dim.dim_cidade.id_cidade


--QUERY RELATORIO
SELECT 
dim.dim_natureza_cvp.natureza AS "NATUREZA",
SUM(CASE WHEN dim_dia."date" = CURRENT_DATE THEN 1 ELSE 0 END) AS "Hoje",
SUM(CASE WHEN dim_dia."date" BETWEEN CURRENT_DATE -6 AND CURRENT_DATE THEN 1 ELSE 0 END) AS "7 Dias",
SUM(CASE WHEN dim_mes."month" = DATE_PART('MONTH', CURRENT_DATE) AND dim_ano."year" = DATE_PART('YEAR', CURRENT_DATE) THEN 1 ELSE 0 END) AS "No Mes"

FROM
dim.fact_cvp
INNER JOIN dim.dim_dia ON dim.dim_dia.id_dia = dim.fact_cvp.id_dia
INNER JOIN dim.dim_ano ON dim.dim_ano.id_ano = dim.fact_cvp.id_ano
INNER JOIN dim.dim_mes ON dim.dim_mes.id_mes = dim.fact_cvp.id_mes
INNER JOIN dim.dim_cidade ON dim.dim_cidade.id_cidade = dim.fact_cvp.id_cidade
INNER JOIN dim.dim_natureza_cvp ON dim.dim_natureza_cvp.id_natureza = dim.fact_cvp.id_natureza
WHERE dim.dim_cidade.cidade = ${param_cidades}
GROUP BY dim.dim_natureza_cvp.natureza

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, a ideia é ser o parametro for informado busca só aquela cidade , senão busca todas as cidades.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, a ideia écser o parametro for informado busca só aquela cidade , senão busca todas as cidades.

Motta obrigado pela disposição. Não funcionou, eu pensei em fazer isso na where:

 

dim.dim_cidade.cidade IN (CASE WHEN ${param_cidades} = 'Todas' THEN ('A', 'B',...) ELSE ${param_cidades} END);

 

Mas não funcionou,acho que por conta de vários resultados no THEN, pois quando coloco somente uma cidade funciona. Você consegue visualizar alguma outra saída?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que deu de errado ?

ERROR: operator does not exist: text = record

 

Se remover os parênteses da erro por conta da vírgula que separa as cidades, mas se colocar somente uma cidade no THEN funciona tranquilo,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente , SELECT

 

 

WHERE dim.dim_cidade.cidade = COALESCE(TRIM(${param_cidades}),dim.dim_cidade.cidade)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente , SELECT

 

 

WHERE dim.dim_cidade.cidade = COALESCE(TRIM(${param_cidades}),dim.dim_cidade.cidade)

Foi não, eu tô achando que só vai sair se fizer em mdx. Mas não sei fazer os cálculos que preciso, tais como variação em relação a períodos anteriores e etc... Por sql faço tranquilo, mas deu esse galho de precisar escolher "Todas", para trazer o somatório de todas as cidades juntas.

Muito obrigado pela paciência Motta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi se o seu problema é SELECIONAR e/ou SOMAR todas as cidades , estecfaz ambas.

Simplificando a sql todavia.

 

 

 

Select (case when trim(${param_cidades is null then 'todas' else cidade end) cidade,sum(valor)

From

WHERE cidade = COALESCE(TRIM(${param_cidades}),cidade)

Group by (case when trim.. end)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi se o seu problema é SELECIONAR e/ou SOMAR todas as cidades , estecfaz ambas.

Simplificando a sql todavia.

 

 

 

Select (case when trim(${param_cidades is null then 'todas' else cidade end) cidade,sum(valor)

From

WHERE cidade = COALESCE(TRIM(${param_cidades}),cidade)

Group by (case when trim.. end)

É que se você observou a sql do relatório eu preciso passar um parâmetro, que vem de um combobox que é resultado da query do seletor. O problema é que na tabela principal o campo cidade é preenchido com 102 municípios distintos. No seletor eu consegui, utilizando o coalesce, incluir o "Todas", mas na query do relatório não estou conseguindo passar o parâmetro "Todas", era para quando escolher "Todas" me trazer o resultado das cidades juntas, as 102.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso de TODAS passe um valor nulo ou em branco para o parâmetro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta resolvido, raciocinei no coalesce que você indicou e cheguei a conclusão que era para fazer com o case da seguinte forma na where:

 

dim.dim_cidade.cidade =
(CASE WHEN (${param_cidades}) = 'Todas' THEN dim.dim_cidade.cidade ELSE (${param_cidades}) END)
Funcionou! Talvez fosse necessário alterar o título do tópico para ajudar mais pessoas, tenho certeza que essa é uma dúvida bastante comum.
Obrigado pela atenção!

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.