我是 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 when
和if
语法确实有两种方法可以做到这一点。
在您的 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/