4

私のプロジェクトでは、データモデルが変更され、情報を取得するために新しいリクエストを行う必要がありますが、以前はすべてのデータが同じ行にあるように見えましたが、現在はそのデータの一部が別のテーブルにあり、返されます私コラム。

したがって、私のリクエストは次のように返されます。

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);

しかし、私は

エラー: 無効な戻り値の型 Etat SQL:42601 詳細: クエリで指定された戻りタプルには 7 つの列がありますが、クロス集計は 5 を返します。

誰かが何が悪いのかを理解するのを手伝ってくれますか?

4

3 に答える 3

1

質問の列formalite.libelleに言及していませんでした。これは、解決策に不可欠です。

メインクエリには明示的な構文を使用することを提案しJOINます-一般的に読みやすく理解しやすい.

いずれにせよ、列定義リスト内のすべての列をスペルアウトする必要があるため、関数の 2 番目のパラメーター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);

この密接に関連する回答の詳細な説明とリンク。

余談ですがdate、列名としては使用しません。SQL では予約語であり、PostgreSQL では型名です。

于 2012-12-05T16:50:39.807 に答える
0

わかった !:

SELECT *
FROM crosstab(
  'SELECT c.cd_type as typcou, c.dt_envoi as dtenvcou, c.commentaire as comment, c.signataire as signur, r.libelle, lf.valeur
       FROM comm.courrier c, formalite.ligne_formalite lf, formalite.formalite f, norme.rubrique r
       WHERE c.id_formalite=f.id AND lf.fk_formalite=f.id
       AND c.id_formalite=1 AND r.id = lf.id_rubrique ORDER BY 1',
       'SELECT DISTINCT libelle FROM norme.rubrique ORDER BY 1')
AS (typcou char, dtenvcou text, comment text, signur text, codepost text, bureau text, date text);
于 2012-12-05T15:17:22.603 に答える
0

オープンソースの ETL スタジオを優先順に試してください。

  1. 才能
  2. ペンタホ
  3. ジャスパーソフト

特に大量のデータに対してこれを頻繁に行う必要がある場合は特にそうですが、本当に Postgresql を使用する必要があるのでしょうか? 必要に応じて、これらのツールを使用して、あるデータベース サーバーから別のデータベース サーバーに移行することもできます。

于 2012-12-05T15:19:36.250 に答える