我正在尝试从我创建的名为 vwindicador_separacao_pedido_inicio_separacao_fisica_resumo 的视图中检索查询结果。 SQL 查询根据 EXTRACT 函数和一些条件逻辑计算给定 id_grupocliente 的某些指标。结果集由 nr_ano、nr_mes 和 pc_aferido 组成。
这是我用于执行查询并映射结果的 C# 代码:
string query =
@"SELECT * FROM vwindicador_separacao_pedido_inicio_separacao_fisica_resumo WHERE id_grupocliente = @idGrupoCliente";
return (await conn.QueryAsync<IndicadorPortal>(query, new { idGrupoCliente })).ToList();
IndicadorPortal类具有三个属性:nr_ano、nr_mes和pc_aferido:
public class IndicadorPortal
{
public int nr_ano { get; set; }
public int nr_mes { get; set; }
public decimal pc_aferido { get; set; }
}
但是,当我运行代码时,遇到错误:
Npgsql.PostgresException (0x80004005): 42601: invalid return type
DETAIL: Query-specified return tuple has 17 columns but crosstab returns 19.
这似乎是与返回的列数相关的错误,但我的查询没有使用交叉表功能。
以下是用于创建视图的 SQL 代码:
DROP VIEW IF EXISTS vwindicador_separacao_pedido_inicio_separacao_fisica_resumo;
CREATE VIEW vwindicador_separacao_pedido_inicio_separacao_fisica_resumo AS
SELECT
EXTRACT(YEAR FROM dt_inclusao) nr_ano,
EXTRACT(Month from dt_inclusao) nr_mes,
sum(case
when coalesce(iso.data_pedido_separado, now() ) > dt_prazofinalproducao then 0.00
else 1.00 end::float) / count(*) pc_aferido,
a.id_grupocliente
FROM public.vwacompanhamento a
INNER JOIN vwindicadorsemocorrencias iso ON a.id_sem = iso.id_sem
group by EXTRACT(YEAR FROM dt_inclusao),
EXTRACT(Month from dt_inclusao)
, a.id_grupocliente
我也尝试过使用动态类型和 IDictionary
为了排除故障,我也使用 ADO.NET 测试了代码,但遇到了相同的错误。我正在寻求有关如何解决此问题的指导。
Postgres 在规划过程中需要知道返回类型和结构,因此不能只返回可变数量的列。我认为,问题就在这段代码中:
sum(case
when coalesce(iso.data_pedido_separado, now() ) > dt_prazofinalproducao then 0.00
else 1.00 end::float) / count(*) pc_aferido,
a.id_grupocliente
如果我没有记错的话,您将在
when
和 else
部分返回不同数量的列。