2017-08-27 14 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