mysql - Case 或 IF THEN 为值添加减号

标签 mysql case data-analysis

我是 SQL 新手,正在参加数据分析类(class),并在尝试解决此问题时遇到问题 - 编写一个查询来查找人口估计年份(我的数据集中的 2016 年 - 2015 年)的差异。将所有值显示为四舍五入到一百个绝对值,除非最近一年(我的数据集中的 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 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;

如果有人能给我指出正确的方向,我会非常感激,我的头皮和我一直在拉的头发也会如此。

最佳答案

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

关于mysql - Case 或 IF THEN 为值添加减号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909181/

相关文章:

mysql - 您应该按周数建立索引吗?

mysql - 基于mysql中两个表的JOIN更新多个字段

sql - PostgreSQL CASE 语句

mysql - 在一个查询中使用 unique 、 Case 和 order by

python - 如何直接在 Pandas DataFrame 中的 PDF 上计算统计指标?

python - Torch7 Mac安装报错

mySQL - 如果语句给出语法错误

mysql多重连接并从两个内部连接表中仅检索一条记录

sql-server - CASE 语句中随机生成的值返回 NULL

Python: Unstacked DataFrame 太大,导致 int32 溢出