1

Postgres データベースにクエリを実行して、過去 4 年間の統計を取得します。ただし、クエリ
の一部でハードコードされた日付を関数に置き換える正しい構文がわかりません。AS

言う:date_part('year',current_date)-1の代わりに"2012"

SELECT * FROM crosstab('
SELECT client,date_part (''year'',date) as SalesDate
       ,Sum(total)::integer AS Synthese
FROM statistic
WHERE date_part(''year'',date)>date_part(''year'',current_date)-5
AND date_part(''year'',date)<date_part(''year'',current_date)
GROUP BY client,SalesDate
ORDER BY 1,2',
$$VALUES 
(date_part('year',current_date)-4),
(date_part('year',current_date)-3),
(date_part('year',current_date)-2),
(date_part('year',current_date)-1)$$)
AS ( client text, "2009" text, "2010" text , "2011" text, "2012" text);
4

1 に答える 1

1

答え

SQL の原則:は動的に指定できますが、識別子は静的です。

外部呼び出しは基本的な SQL ステートメントであり、列定義リストは値ではなく識別子で構成されます。(そのため、数字で始まる不正な識別子を二重引用符で囲む必要があります。) したがって、この場所で関数呼び出しを使用することはできません。不可能です。

考えられる回避策

これにはトリッキーな方法があります。多相複合型を返す plpgsql 関数を作成し、明確に定義された複合型のパラメーターを渡すことができます。これには列名も含まれます。しかし、それは非常に高度なものです。これを行うには、plpgsql を使いこなす必要があります。

この関連する質問に対する私の包括的な回答を検討してください:
PL/pgSQL 関数をリファクタリングして、さまざまな SELECT クエリの出力を返す
回答の後半はあなたのためです。

明確に定義された複合型が必要なため、この方法で関数を呼び出す前に型を作成する必要があります。または、一時テーブルを作成するだけです (自動的に型を提供します)。動的 SQL を使用して現在の日付から列名を導出するステートメントを使用して、これを自動化できDOます...簡単だとは決して言いませんが、可能です。

ベースクエリ

それまでの間、crosstab()クエリは改善される可能性があります。

SELECT * FROM crosstab(
    $$
    SELECT client
          ,date_part ('year', date) AS salesdate
          ,sum(total)::int AS synthese
    FROM   statistic
    WHERE  date >= date_trunc('year', now()) - interval '5y'
    AND    date <  date_trunc('year', now())
    GROUP  BY 1,2
    ORDER  BY 1,2
    $$

    ,$$VALUES 
         (date_part('year', now()) - 4)
        ,(date_part('year', now()) - 3)
        ,(date_part('year', now()) - 2)
        ,(date_part('year', now()) - 1)
    $$
    )
AS  (client text
     ,"2009" text
     ,"2010" text
     ,"2011" text
     ,"2012" text);

残りは好みとスタイルの問題です。

于 2013-01-18T03:54:55.223 に答える