gpt4 book ai didi

sql - crosstab postgres - 行到列

转载 作者:行者123 更新时间:2023-11-29 11:37:08 24 4
gpt4 key购买 nike

在我的项目中,数据模型发生了变化,我必须执行一个新的请求来获取信息,但在过去看起来所有数据都在同一行中,但现在部分数据在另一个表中,它返回我的专栏。

所以我的请求返回:

http://www.hostingpics.net/viewer.php?id=724031request.jpg

我认为这很简单,但我真的不明白函数 crosstab 是如何工作的。我试过这个:

    SELECT *
FROM crosstab(
'SELECT c.cd_type as typcou, c.dt_envoi as dtenvcou, c.commentaire as comment, c.signataire as signur
FROM comm.courrier c
WHERE c.id_formalite=1
order by 1,2',
'select lf.valeur as valeur from formalite.ligne_formalite lf, formalite.formalite f where lf.fk_formalite=f.id AND lf.fk_formalite=1'
)

AS c(typcou text, dtenvcou text, comment text, signataire text, valeur1 text, valeur2 text, valeur3 text);

但是,我得到了

ERREUR: invalid return type État SQL :42601 Détail :Query-specified return tuple has 7 columns but crosstab returns 5.

谁能帮我找出问题所在?

最佳答案

您没有在问题中提及列 formalite.libelle,这对解决方案至关重要。

我建议对您的主要查询使用明确的 JOIN 语法 - 通常更易于阅读和理解。

由于无论如何都必须拼出列定义列表中的所有列,因此使用 VALUES 表达式比使用 SELECT DISTINCT ... 更有效crosstab() 函数的参数:

SELECT *
FROM crosstab(
'SELECT c.cd_type, c.dt_envoi, c.commentaire, c.signataire
, r.libelle, lf.valeur
FROM comm.courrier c
JOIN formalite.formalite f ON f.id = c.id_formalite
JOIN formalite.ligne_formalite lf ON lf.fk_formalite = f.id
JOIN norme.rubrique r ON r.id = lf.id_rubrique
WHERE c.id_formalite = 1
ORDER BY 1'

,$$VALUES ('codepost'::text), ('bureau'), ('date')$$
)
AS (typcou char, dtenvcou text, comment text, signur text
, codepost text, bureau text, date text);

More explanation and links in this closely related answer.

另外:我不会使用 date 作为列名,它是 reserved word在 SQL 中和在 PostgreSQL 中的类型名称。

关于sql - crosstab postgres - 行到列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13725253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com