2017-08-27 42 views
0

我是SQL新手,需要一個數據分析類,並且有問題試圖解決這個問題 - 編寫查詢來查找人口估計年份的差異(Y2016 - Y2015在我的數據集)。除非最近一年(我的數據集中Y2016)下降超過10K,否則將所有值均舍入爲100個絕對值,則這些值必須爲負值。用例或IF THEN給數值加上減號

我使用MYSQL 6.3.9,Mac OS X上10.12

我有了這個作爲我的連接語句

SELECT s.StateName, c.Y2016, c.Y2015, round((abs(Y2016 - Y2015)), -2) AS Difference 
    FROM StateCensus AS c 
    INNER JOIN States AS s 
    WHERE s.StateID = c.YearID 
    ORDER BY Difference DESC; 

我無法弄清楚如何獲得一個CASE語句在「差異」列中工作。

SELECT Y2016, Y2015, round((Y2016 - Y2015), -2) as Test, 
     CASE 
      WHEN Y2015 >= (Y2016 + 10000) THEN round((Y2016 - 2015), -2) 
      ELSE round((abs(Y2016 - Y2015)), -2) 
     END as Difference 
    FROM StateCensus; 

我添加了測試列以查看測試目的的實際值。而且我知道,一旦將它放入主查詢中,我需要將YXXX列別名化。我只是想弄清楚現在如何獲得正確的值。

當我用上面的CASE運行它時,應該有3行需要負值。 「測試」列給出正確的值,「差異」列給出3個負向行以外的所有正確值。我不確定它在差異列中做了什麼。這是應該是負面的3行之一。

Y2016  Y2015  Test  Difference 
    12801539 12839047 -37500 -12799500 

我也試過

SELECT Y2016, Y2015, round((Y2016 - Y2015), -2) as Test, 
     CASE 
      WHEN (Y2016 - Y2015) >= -10000 THEN round((abs(Y2016 - 2015), -2) * -1 
      ELSE round((abs(Y2016 - Y2015)), -2) 
     END as Difference 
    FROM StateCensus; 

這一個是即使所有具有他們應該是什麼樣的負面價值觀和遙遠的區別列的多了。我認爲我的第一個CASE聲明更符合正確的方向。

或者我應該使用IF THEN?當我嘗試這個時,由於語法錯誤,我無法使它工作。

SELECT s.StateName, c.Y2016, c.Y2015, 
     IF(c.Y2015 >= (c.Y2016 + 10000), SELECT -1 * round((abs(c.Y2016-c.Y2015)), -2), SELECT round((abs(c.Y2016 - c.Y2015)), -2) AS Difference 
    FROM StateCensus c 
    INNER JOIN States AS s 
    WHERE s.StateID = c.YearID 
    ORDER BY Difference DESC; 

我會如此感激,正如我的頭皮,我一直拉頭髮,如果有人能在正確的方向指向我。

+0

我認爲這只是一個錯字。在第一次嘗試時,你寫了' - 2015'而不是' - Y2015'。它應該工作正常。在你的'IF'嘗試中,你不應該包含'select'關鍵字,並且你可以像下面這樣縮短:'IF(c.Y2015> =(c.Y2016 + 10000),-1,1)* round(( abs(c.Y2016-c.Y2015)),-2)AS差異 – trincot

+0

你太棒了!我停止使用CASE語句,因爲即使我修正了我的錯字(我認爲我花了太多時間盯着我的查詢),它也給出了錯誤的答案。所以,我調整了IF聲明,並拿出了SELECTS,它的工作原理!你已經救了我的頭皮! – vbchomp

+0

我發佈它作爲答案。 – trincot

回答

0

case whenif語法確實是兩種方式來做到這一點。

在你case when嘗試你有一個錯字:- 2015應該- Y2015,比較應該是<=而不是>=。此外,您可以使用此結構只是以確定是否與1或-1相乘,而不需要重複round(abs(...))表達:

CASE 
    WHEN c.Y2016 - c.Y2015 <= -10000 THEN -1 
            ELSE 1 
END * round(abs(c.Y2016 - c.Y2015), -2) as Difference 

在你轉身的條件表達式的語法IF,和那裏的>=是正確的,但select關鍵字不應該在那裏。所以呢:

IF (c.Y2015 >= c.Y2016 + 10000, -1, 1) * round(abs(c.Y2016-c.Y2015), -2) AS Difference