2016-04-19 11 views
-2

更新が必要なテーブルにカラムがあります。列は次のように計算されます。SQL計算カラムを更新する

SELECT CASE WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30)) 
      WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30)) 
     END AS marktwert 
FROM _spieler; 

この表のすべてのレコードの列を更新したいとします。

私は

UPDATE _spieler SET marktwert = CASE WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30)) 
       WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30)) 
      END; 

のようなものを使用することができますクエリが正しいように思える、しかし、それは行ごとにゼロに「marktwert」に値を設定します。

CREATE TABLE `_spieler` (
    `id` int(10) NOT NULL, 
    `vorname` varchar(30) DEFAULT NULL, 
    `nachname` varchar(30) DEFAULT NULL, 
    `geburtstag` date NOT NULL, 
    `w_staerke` tinyint(3) NOT NULL, 
    `w_technik` tinyint(3) NOT NULL, 
    `marktwert` int(10) NOT NULL DEFAULT '0', 
    `age` tinyint(3) DEFAULT NULL, 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=535 ; 

(1, 'Adam', 'Federici', '1985-01-31', 30, 20, 0, NULL), 
(2, 'Ryan', 'Allsop', '1992-06-17', 20, 30, 0, NULL), 
(3, 'Tyrone', 'Mings', '1980-03-13', 40, 20, 0, NULL), 
(4, 'Joe', 'Bennett', '1990-03-28', 25, 30, 0, NULL), 
(5, 'Charlie', 'Daniels', '1986-09-07', 50, 30, 0, NULL); 

テーブル定義といくつかのサンプルデータが

UPDATE _spieler 
SET marktwert = CASE WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30)) * 600000 
WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN (((w_staerke/100*70) + (w_technik/100*30)) * 600000) - 5000000 
WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) > 31 THEN (((w_staerke/100*70) + (w_technik/100*30)) * 600000) - 10000000 END 

最終クエリは、あなたの問題は、あなたが(プレーヤーのための任意のmarktwert値より古い31年である(Spieler)を計算していないということです

+2

SOはSQLチュートリアルですか? –

+0

恒星の質問 –

+0

ここで彼は新しいです、私は彼に古い質問に基づいて新しい質問を作成するように提案しました。私は彼が少し急いで、この貧弱な公式のものを投稿したと思います。私はいくつかの文脈を追加するために完全に書き直しました。あなたはあなたのダウンフォートを取り戻すことができますので、将来的に助けを求めることに落胆することはありませんか? :)) –

答えて

1

を追加しましたgeburtstag =誕生日)。あなたのUPDATEステートメントは、をと定義されているmarktwert列に書き込もうとしています。その結果、エラーになります。

ソリューション:

1)ユーザーELSEあなたCASE文で、デフォルト値を設定:

UPDATE _spieler SET marktwert =  CASE 
     WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30)) 
     WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30)) 
     ELSE 0 
    END; 

2)列marktwertためNULL値を許可:

CREATE TABLE `_spieler` (
    ... 
    `marktwert` int(10) NULL DEFAULT '0', 
    ... 
) 

3 )WHERE条件を使用してください:

UPDATE _spieler SET marktwert =  CASE 
     WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30)) 
     WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30)) 
    END 
WHERE TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31; 

更新:あなたはまた、代わりにmarktwert列を削除し、view(計算表)を使用することができます。

CREATE VIEW `_spieler_view` AS SELECT s.*, 
    CASE 
     WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 27 THEN ((w_staerke/100*70) + (w_technik/100*30)) 
     WHEN TIMESTAMPDIFF(YEAR, geburtstag, NOW()) <= 31 THEN ((w_staerke/100*70) + (w_technik/100*30)) 
    END AS marktwert_calculated 
from _spieler s ; 

アップデート2:あなたはMariaDBを使用している場合

はあなたもVirtual (Computed) Columns

を使用することができます
+0

私の質問を単純化しようとすると、実際に問題が発生しました。どうもありがとう、最後にやった:)他の誰もが(試して)助けて! – Malgunda

+0

私は、 'marktwert'のためにnegativの値を得ることがあることを知りました。すべての負の値を自動的に1の値に変更する必要がありますか?解決策1は、実際には最高の努力のおかげで働いた! – Malgunda

+0

どのように負の値が可能ですか? 'w_staerke'または' w_technik'は負でなければなりません。それは事実ですか? –