Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!
>
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
Não, a ideia é ser o parametro for informado busca só aquela cidade , senão busca todas as cidades.
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?
O que deu de errado ?
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,
Tente , SELECT
WHERE dim.dim_cidade.cidade = COALESCE(TRIM(${param_cidades}),dim.dim_cidade.cidade)>
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.
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)
>
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.
No caso de TODAS passe um valor nulo ou em branco para o parâmetro.
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!
Tente
WHERE cidade = coalece(${parametro_cidade},cidade)
http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm#SQLRF00617