Case或IF然后将减号添加到值

时间:2017-08-27 20:43:59

标签: mysql case data-analysis

我是SQL的新手,参加数据分析课程,并且在尝试解决此问题时遇到问题 - 编写查询以查找人口估计年数的差异(我的数据集中的Y2016 - Y2015)。将所有值显示为舍入为百的绝对值,除非最近一年(我的数据集中的Y2016)减少了10K以上,否则这些值必须为负值。

我在Mac OS X 10.12上使用MYSQL 6.3.9

我已将此作为我的加入声明

    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那么?当我尝试这个时,由于语法错误,我无法让它工作。

    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;

如果有人能指出我正确的方向,我会非常感激,就像我的头皮和我一直拉着的头发一样。

1 个答案:

答案 0 :(得分: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