2017-01-18 7 views
0

私は人のリストを持っており、その年にプロパティの日付がある年にグループ化された人の数を取得したいと思います。 問題は、検索したい年数が現在の過去から現在までのものであることです。ユーザーがそれを選択することを願っています。 現在、私は10年前の情報を取得していますが、ユーザーは任意の年数を入力することができます。あなたは、列の最も簡単な解決策として、それはJSONとしてそれを持っていることをしたい場合は各反復で値を取得してリストに戻す方法

select to_char(d, 'YYYY') as year, count(id) as total 
from 
    jb_persona 
    right join 
    generate_series(
     date_trunc('year', now() - interval '10 years'), 
     now(), interval '1 year' 
    ) gs(d) on gs.d = date_trunc('year', fecha_conversion) 
where id_iglesiafk = aidiglesia 
group by 1 

::また、外側の出力でゼロカウント数年を持っている

CREATE OR REPLACE FUNCTION convertidos_neto_10_year_ago(IN aidiglesia integer) 

    RETURNS TABLE(cant0 bigint, cant1 bigint, cant2 bigint, cant3 bigint, cant4 bigint, cant5 bigint, cant6 bigint, cant7 bigint, cant8 bigint, cant9 bigint, cant10 bigint) AS 

$BODY$BEGIN 

RETURN Query SELECT 

(SELECT count(jb_persona.id) 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = date_part('year'::text, ('now'::text)::date) - (10)::double precision))) , 

(SELECT count(jb_persona.id) 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = (date_part('year'::text, ('now'::text)::date) - (9)::double precision)))) , 

(SELECT count(jb_persona.id) AS count3 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = (date_part('year'::text, ('now'::text)::date) - (8)::double precision)))) , 

(SELECT count(jb_persona.id) AS count4 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = (date_part('year'::text, ('now'::text)::date) - (7)::double precision)))) , 

(SELECT count(jb_persona.id) AS count5 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = (date_part('year'::text, ('now'::text)::date) - (6)::double precision)))) , 

(SELECT count(jb_persona.id) AS count5 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = (date_part('year'::text, ('now'::text)::date) - (5)::double precision)))) , 

(SELECT count(jb_persona.id) AS count5 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = (date_part('year'::text, ('now'::text)::date) - (4)::double precision)))) , 

    (SELECT count(jb_persona.id) AS count5 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = (date_part('year'::text, ('now'::text)::date) - (3)::double precision)))) , 

(SELECT count(jb_persona.id) AS count5 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = (date_part('year'::text, ('now'::text)::date) - (2)::double precision)))) , 

(SELECT count(jb_persona.id) AS count5 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = (date_part('year'::text, ('now'::text)::date) - (1)::double precision)))) , 

(SELECT count(jb_persona.id) AS count5 
      FROM jb_persona 
      WHERE ((jb_persona.id_iglesiafk = aidiglesia) AND (date_part('year'::text, jb_persona.fecha_conversion) = (date_part('year'::text, ('now'::text)::date) - (0)::double precision)))); 

END; 

$BODY$ 

    LANGUAGE plpgsql VOLATILE 
    COST 100 
    ROWS 1000; 

ALTER FUNCTION convertidos_neto_10_year_ago(integer) 

OWNER TO postgres; 
+0

ので、あなたが欲しいですその関数の引数に依存する関数によって返される動的な列の数? –

+0

可変数の列は簡単ではなく、特別な呼び出し構文が必要です(PostgreSQLのエンジンは呼び出しから返される列の数を知る必要があります。正確に入力してください)。 - なぜ単に 'where year_part( 'year'、fecha_conversion)+ 10> = date_part( 'year'、now())GROUP BY date_part( 'year'、fecha_conversion)'? (その結果、複数の列ではなく複数の行になります) – pozs

+0

はい、@ VaoTsun。 1つの列とディナミック列の数にすることができます。年の数が10、1列と10行の場合... – meyquel

答えて

1

は、生成された年のシリーズに参加

select jsonb_object_agg(year, total) 
from (
    select to_char(d, 'YYYY') as year, count(id) as total 
    from 
     jb_persona 
     right join 
     generate_series(
      date_trunc('year', now() - interval '10 years'), 
      now(), interval '1 year' 
     ) gs(d) on gs.d = date_trunc('year', fecha_conversion) 
    where id_iglesiafk = aidiglesia 
    group by 1 
) s 
を9.4使用する場合

select jsonb_object(array_agg(year), array_agg(total::text)) 
from ... 
+0

Netto、ありがとうございますしかし:【のErr] ERROR:なしexisteラfunciónjsonb_object_agg(テキスト、BIGINT) LINE 1:選択jsonb_object_agg(年、合計) ^ HINT:ELノンブルY tiposデargumentos PuedeのSERのnecesario agregar変換explícitaEN Ningunafunciónが一致投稿者 – meyquel

+0

@meyquel Postgresqlのバージョンは何ですか? –

+0

ポストグル9.4バージョン – meyquel

関連する問題