2

五分位ラベル (-1、1、2、3、4、5) で整理されたデータがあります。列内のこれらの値のそれぞれについて、Quintileと呼ばれる別の列に値がありますret。最後に、月末の日付を整数として含む日付の列があります。

私の目標は、インデックスのように機能する日付列のみを使用して、それぞれが独自の列として、すべての Quintile リターン データを同時に視覚化することです。

Quintile基本的に、私はこのコラムにピボットしたいと考えておりIF、これを達成する方法として MySQL でステートメントを使用することを勧めている他の場所を見てきました。

たとえば、データの 1 つの五分位数に相当するクエリを次に示します。

select yearmonth, ret
where Quintile=1
from quintile_returns

しかし、すべての五分位ラベルに対してこれを繰り返したり、データを個別に保存したり、Python Pandas や Excel などでつなぎ合わせたりしたくはありません。SQL に個別の列として表示させたい。

しかし、このIFステートメント スタイルの貧しい人のピボットを試すとき、これは私が使用するクエリです。

select yearmonth, 
       IF(Quintile=1, ret, NULL) as Q1_ret,
       IF(Quintile=2, ret, NULL) as Q2_ret
from quintile_returns

基本的に、有効なデータの対角線が返されます。五分位数が 1 ではないすべての行は引き続き表示され、NULL が入力されます。次に、五分位数 2 についても同様です。

これらの余分な NULL 値をすべて回避するにはどうすればよいですか? 基本的に、条件が満たされた場合にのみ列の値を返すようにSQLに指示し、 NULLなどをデフォルトのelseようなプレースホルダーとして使用しないようにします。

ネストされた結合型ステートメントを含まないこれを行う方法はありますか?

4

2 に答える 2

2

入力データの複数行に対して出力を 1 行だけにしたいので、値を集計する必要があります。この場合、それらを でグループ化しyearmonthます。1つの可能な(特に移植性はありませんが)方法は次のとおりです。

SELECT yearmonth
     , SUM((Quintile=1)*ret) AS Q1
     , SUM((Quintile=2)*ret) AS Q2
FROM quintile_returns
GROUP BY yearmonth

このややハックなアプローチは、MySQL のような比較では false とtrue の場合Quintile=1に整数が得られるという事実を利用しています。したがって、あなたは一致する五分位数を採用し、他のものを採用します。物事をより明確にし、移植性を高めたい場合は、次のように書くこともできます。011*ret=ret0*ret=0

SELECT yearmonth
     , SUM(IF(Quintile=1, ret, 0)) AS Q1
     , SUM(IF(Quintile=2, ret, 0)) AS Q2
FROM quintile_returns
GROUP BY yearmonth
于 2012-12-11T15:56:29.907 に答える
1

GROUP BY各値に対して 1 つの行のみを表示しyearmonth、次に IF() ステートメントと共に SUM() を使用して、列の IF() 条件が TRUE と評価された場合にのみ VALUES が合計されるようにすることがretできます。

SELECT `yearmonth`,
    SUM(IF(`Quintile` = 1, ret, NULL)) as `Q1_ret`,
    SUM(IF(`Quintile` = 2, ret, NULL)) as `Q2_ret`
FROM `quintile_returns`
GROUP BY `yearmonth`

それ以外の場合は、IF() ステートメントに関する正しい考えがありました。

于 2012-12-11T15:56:10.750 に答える