0

私は2つのテーブルを持っています。1つには注文要素(OE)があり、もう1つにはプロジェクト情報(PO)があります。1つのプロジェクトには多くの注文要素があります。テーブルの設定方法、プロジェクトの日付はPOにあり、通貨はOEにあります。OEテーブルのユーロ為替レートを更新する必要があります。私はこのようなことをしようとしています

    UPDATE [OETest]
    SET [Euro Exchange Rate] = {
    CASE
        WHEN (DATEPART(month, PO.[Project Date Time]) = January)
        THEN 8.143296
        WHEN (DATEPART(month, PO.[Project Date Time]) = February)
        THEN 8.340111
    }
    FROM [POTest] PO, [OETest] OE       
    WHERE OE.[Currency] = 'YUAN'

しかし、私は迷子になっています(これは私が試した多くのクエリの1つです)。誰かが私が必要なクエリを構築し、それが機能する理由を私に話すのを手伝ってもらえますか?

この特定のクエリは、キーワードCASEの近くに不正な構文があることを示しています

私が達成しようとしていることをより明確にするために、OEテーブルにユーロの為替レートの列があります。私はウェブサイトから得た平均月間為替レートを持っています(表にはありません)。プロジェクトの月と通貨に基づいて、この為替レートの列を設定したいと思います。各通貨を別々のクエリで処理するので、このクエリで心配しているのは人民元だけです。月はPOテーブルにあります。caseステートメントでPOテーブルの月を使用する必要があります。

4

2 に答える 2

5
UPDATE OE -- the alias here rather than the base table name
   SET [Euro Exchange Rate] = 8.143296
  FROM [POTest] PO
  JOIN [OETest] OE ON OE.project_id = PO.project_id -- you need a link       
 WHERE OE.[Currency] = 'YUAN'
    -- the following date range represents January this year
    AND PO.[Project Date Time] >= '20120101'
    AND PO.[Project Date Time] <  '20120201'

異なる日付に応じて異なる値が必要な場合にのみ、case ステートメントが必要です。

UPDATE OE -- the alias here rather than the base table name
   SET [Euro Exchange Rate] =
       CASE Month(PO.[Project Date Time])
            when 1 then 8.143296
            when 2 then 7.143296
            when 3 then 7.743296
            END
  FROM [POTest] PO
  JOIN [OETest] OE ON OE.project_id = PO.project_id -- you need a link       
 WHERE OE.[Currency] = 'YUAN'
    -- the following date range represents 3 months this year
    AND PO.[Project Date Time] >= '20120101'
    AND PO.[Project Date Time] <  '20120401'
于 2012-12-14T20:10:27.263 に答える
1

正確には何が問題だと思われますか?

クエリには多くの問題があります。あなたが得ているSQLエラーは何ですか?

いずれにせよ、私があなたがしていると「思っている」ことと同じことをしようとするなら、私はこれをします:

UPDATE [OETest] OE
SET [Euro Exchange Rate] = 
(SELECT CASE WHEN (DATEPART(month, PO.[Project Date Time]) = 'January')
    THEN 8.143296
    ELSE 0.000000
END ExchageRate
FROM [POTest] PO)      
WHERE OE.[Currency] = 'YUAN'

ここでやろうとしているのは、SET ブロックの後に必要な結果を選択することです。CASE ステートメントでは、日付部分から結果が得られない場合に備えて、else を追加しました。

その OETest テーブル内のすべてのレコードを更新する場合を除き、更新するレコードを指定する必要があるため、WHERE 部分は UPDATE 句の WHERE 条件にする必要があります。

要約すると、あなたは言っています

Project Date Time フィールドの月の部分が 1 月に等しい場合、ユーロ為替レート フィールドを POTest テーブルの値で更新し、通貨値が 'YUAN' である OETest テーブルのレコードを更新します。

SELECT ステートメントに WHERE 句が必要になる場合があることに注意してください。これは、複数のレコードが返される可能性があり、プロジェクトの日時フィールドを取得するために 1 つだけが必要なためです。推測では、次のような where ステートメントを追加することをお勧めします。

UPDATE [OETest] OE
SET [Euro Exchange Rate] = 
(SELECT CASE WHEN (DATEPART(month, PO.[Project Date Time]) = 'January')
    THEN 8.143296
    ELSE 0.000000
END ExchageRate
FROM [POTest] PO WHERE PO.ProjectID = 100)      
WHERE OE.[Currency] = 'YUAN'

これが役立つかどうか教えてください。

よろしくJT

于 2012-12-14T20:23:30.173 に答える