2012-12-11 16 views
2

我有一些按五分位數標籤組織的數據(-1,1,2,3,4,5)。對於Quintile列中的每個值,在另一列中的值爲ret。最後,將包含月末日期的日期列作爲整數。MySQL:使用IF語句來轉動,但獲得大量NULL值

我的目標是將所有的Quintile返回數據同時顯示出來,每個數據都作爲自己的列,只有日期列的行爲像索引一樣。

本質上,我想轉到Quintile列,並且我看到其他地方建議在MySQL中使用IF語句作爲實現此目的的一種方式。

例如,下面是一個查詢,將顯示一個五分之一人口的價值數據:

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 

我基本上得到一個對角線有效數據的後面。對於Quintile 2,所有Quintile不爲1的行仍然顯示,填充NULL,然後如此。

如何避免所有這些額外的NULL值?基本上,如果條件滿足,我想告訴SQL返回列值,只有,並且不要使用NULL或其他任何類似於默認else的佔位符。

有沒有辦法做到這一點,不涉及嵌套連接類型的語句?

回答

1

您可以使用GROUP BY只與您的IF()語句,使ret值僅概括一同顯示,每一列都yearmonth值,然後SUM()在列的IF()條件計算爲TRUE:

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()語句有正確的想法。

2

由於您希望只有一行輸出用於多行輸入數據,您必須彙總您的值。在這種情況下,您想按yearmonth對它們進行分組。一個可能的(雖然不是特別便攜式)的方法是如下:

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

這種輕微的hackish方法利用的是像在MySQL Quintile=1的比較產生一個整數,0假,1真正的事實。因此,您需要1*ret=ret與其他Quintile匹配,0*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