2017-08-27 17 views
0

データ分析クラスを使用してこの問題を解決しようとすると問題が発生しました。人口予測の年数の違いを見つけるためのクエリを作成します(Y2016 - 私のデータセットのY2015)。最新の年(私のデータセットのY2016)が10Kを超えて減少していない限り、すべての値を100絶対値に丸めて表示すると、これらの値は負である必要があります。数値にマイナス記号を追加する場合

私は私がCASE文を取得する方法を見つけ出すことができない私の結合文

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; 

としてこれを持っているのMac OS X 10.12

に、MYSQL 6.3.9を使用してい

差異の列に入る作業を行います。

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行のうちの1つです。

Y2016  Y2015  Test  Difference 
    12801539 12839047 -37500 -12799500 

Iも

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; 

を試みこの1差分列が負の値を有する方法オフ彼らがどうあるべきかからのすべてとオフも多いです。私は最初の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; 

誰かが正しい方向に私を指すことができれば、私は、私の頭皮と私が引っ張ってきた髪と同じように、とても感謝されます。

+0

これは単なる誤植です。あなたの最初の試みでは、 ' - Y2015'の代わりに' - 2015'を書きました。それは正常に動作するはずです。 'IF'の試みでは、' select'キーワードを含めてはいけません。 'IF(c.Y2015> =(c.Y2016 + 10000)、-1,1)* round( abs(c.Y2016-c.Y2015))、-2)AS差異 – trincot

+0

あなたは素晴らしいです!私は私の誤植を修正したとしても(私は私のクエリを見てあまりにも多くの時間を費やしたと思う)、それは間違った答えを与えたように、CASE文の使用を停止しました。だから、私はIFステートメントを調整してSELECTSを取り出し、それは動作します!あなたは私の頭皮を救った! – vbchomp

+0

答えとして投稿しました。 – trincot

答えて

0

case whenifの構文は、本当に2つの方法です。 - 2015- Y2015であるべきであり、比較は<=の代わり>=する必要があります:あなたはタイプミスがあった、あなたのcase when試みで

。また、あなたがround(abs(...))表現を繰り返す必要がなく、1または-1を乗算するかどうかを判断するだけで、この構文を使用することができます。IF構文で

CASE 
    WHEN c.Y2016 - c.Y2015 <= -10000 THEN -1 
            ELSE 1 
END * round(abs(c.Y2016 - c.Y2015), -2) as Difference 

を、あなたは条件式回って、そこ>=正解ですが、selectというキーワードは存在しません。そう:

IF (c.Y2015 >= c.Y2016 + 10000, -1, 1) * round(abs(c.Y2016-c.Y2015), -2) AS Difference 
関連する問題