2017-03-21 5 views
0
で結果にCASEからの計算を使用

私は、次のビューがあります。このビューはcreatedatepartidあたりの最古の記録作成日のタイムスタンプ)を受け取り、この日付以降に渡さヶ月を計算は、PostgreSQL

CREATE OR REPLACE VIEW view_a AS 
SELECT distinct p.partid, case when 
       (SELECT EXTRACT(YEAR FROM age) * 12 + EXTRACT(MONTH FROM age) 
       FROM age(NOW(), LEAST(pp.createdate)) AS t(age)) AS months_between 

       <24 then months_between::integer else 24 end as timeframe 
    FROM .... 
    WHERE ....; 

を結果は24(ヶ月)よりも小さい場合here を行って同じNOW()に私は、そうでない場合は、私が24

これは、現在、それは例途中でAS months_betweenを受け入れていない動作しない場合は、この結果が欲しいです。

どうすればいいですか?

EDIT:

たとえば、このクエリは動作します:

SELECT distinct p.partid, case when 
       (SELECT EXTRACT(YEAR FROM age) * 12 + EXTRACT(MONTH FROM age) 
       FROM age(NOW(), LEAST(pp.createdate)) AS t(age)) 
       <24 then 5 else 24 end as timeframe 
    FROM .... 
    WHERE ....; 

しかし、それは、5または24を返し、それは私が欲しいものではありません。私はそれがCASEで計算された値を返すようにしたい。質問を簡素化するために

は、基本的な形式は次のとおりです。

case when calculated_value < 24 then calculated_value else 24 end; 

は、私はケースにcalculated_valueを返すことができるようにしたいです。

+0

ここではLEASTを使用できませんか? https://www.postgresql.org/docs/8.1/static/functions-conditional.html#AEN12704 –

+0

@RCを参照してください。 LEASTは問題ではありません。編集を参照してください。 – avi

+0

それから計算をあなたのTHENにコピーしてください。ELSE –

答えて

1

あなたは(クエリを含む)MONTHS_BETWEEN計算を移動するcommon table expressionしようとすることができ、このような何か:

WITH timeframe_table AS (
    SELECT EXTRACT(YEAR FROM age) * 12 + EXTRACT(MONTH FROM age) 
    FROM age(NOW(), LEAST(pp.createdate)) AS months_between 
) SELECT 
    CASE when months_between< 24 then months_between else 24 as timeframe 
     FROM ..., timeframe_table 
     WHERE... 

あなたは、いくつかは、あなたのテーブルと結合条件を持っているtimeframe_tableためにいくつかのidフィールドを追加する必要があります。

+0

あなたのクエリと「どこで」の条件に関する詳細情報を提供できますか? –

+0

あなたはまだ 'DISTINCT'を追加することができます。あなたは' WHERE'条件をWITH節の中で動かすことができます。しかし、あなたが抱えている問題を解決するために、より詳細な情報が必要です。 –