我是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;
我会如此感激,正如我的头皮,我一直拉头发,如果有人能在正确的方向指向我。
我认为这只是一个错字。在第一次尝试时,你写了' - 2015'而不是' - Y2015'。它应该工作正常。在你的'IF'尝试中,你不应该包含'select'关键字,并且你可以像下面这样缩短:'IF(c.Y2015> =(c.Y2016 + 10000),-1,1)* round(( abs(c.Y2016-c.Y2015)),-2)AS差异 – trincot
你太棒了!我停止使用CASE语句,因为即使我修正了我的错字(我认为我花了太多时间盯着我的查询),它也给出了错误的答案。所以,我调整了IF声明,并拿出了SELECTS,它的工作原理!你已经救了我的头皮! – vbchomp
我发布它作为答案。 – trincot