我是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;
我會如此感激,正如我的頭皮,我一直拉頭髮,如果有人能在正確的方向指向我。
我認爲這只是一個錯字。在第一次嘗試時,你寫了' - 2015'而不是' - Y2015'。它應該工作正常。在你的'IF'嘗試中,你不應該包含'select'關鍵字,並且你可以像下面這樣縮短:'IF(c.Y2015> =(c.Y2016 + 10000),-1,1)* round(( abs(c.Y2016-c.Y2015)),-2)AS差異 – trincot
你太棒了!我停止使用CASE語句,因爲即使我修正了我的錯字(我認爲我花了太多時間盯着我的查詢),它也給出了錯誤的答案。所以,我調整了IF聲明,並拿出了SELECTS,它的工作原理!你已經救了我的頭皮! – vbchomp
我發佈它作爲答案。 – trincot