我是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;
如果有人能指出我正确的方向,我会非常感激,就像我的头皮和我一直拉着的头发一样。
答案 0 :(得分:0)
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