2016-07-16 11 views
1

値をBillingテーブルに挿入しようとしています。 BillingAmountについては、ゲストがチェックアウトする時間に応じて変更したいと思います。ゲストが正午までにチェックアウトした場合、BillingAmountはQuotedRateに滞在した泊数を乗算したものにします。 1:00 PM以降にチェックアウトした場合、50%の追加料金が加算されます。チェックアウトの時間は、現在のシステム時間を使用しています。簡単に言えば、INSERT INTOクエリでIF文を使用しようとしています。しかし、私はIF文のまわりで構文エラーを得ています。どのように構文エラーを取り除くためにこれをフォーマットするのですか?どんな助けもありがとう。ここに行くINSERT INTOステートメントでIFステートメントを使用する

SET IDENTITY_INSERT Billing OFF 
INSERT INTO Billing (FolioID, BillingCategoryID, BillingDescription, BillingAmount, BillingItemQty, BillingItemDate) 
VALUES(24 
     , 1 
     , 'Room' 
     , IF(CAST(GETDATE() as time) < '12:00 PM') 
      SELECT QuotedRate * Nights AS "TotalLodging" 
      FROM Folio 
     ELSE IF(CAST(GETDATE() as time) > '1:00 PM') 
      SELECT (QuotedRate * Nights) + ((QuotedRate * Nights) * .50) AS "TotalLodging" 
      FROM Folio 
     , 1 
     , GETDATE()); 
+2

'CASE WHEN'ステートメントを使用してください。しかし、私はあなたのビジネスレイヤ(.net)で "ロジック"作業を行い、データのセーブ/アップデートにのみ 'SQLクエリ 'を使用する方が良いと思います。 – Fabio

+0

これは回答には直接関係しませんが、彼らが午後12時30分にチェックアウトすれば? –

答えて

-1
INSERT INTO Billing (FolioID, BillingCategoryID, BillingDescription, BillingAmount, BillingItemQty, BillingItemDate) 
VALUES(
    24 
    , 1 
    , 'Room' 
    , CASE WHEN (CAST(GETDATE() as time) < '12:00 PM') then 
     (
      SELECT QuotedRate * Nights AS "TotalLodging" FROM Folio 
     ) 
    ELSE 
     ( 
      SELECT (QuotedRate * Nights) + ((QuotedRate * Nights) * .50) AS "TotalLodging" 
      FROM Folio 
     ) 
    End 
    , 1 
    , GETDATE() 
) 
+0

Folioに複数の行がある場合、それはうまくいきません – Esperento57

2

!これがあなたのSQLです。

SET IDENTITY_INSERT Billing OFF 

INSERT INTO Billing 
(
    FolioID 
    , BillingCategoryID 
    , BillingDescription 
    , BillingAmount 
    , BillingItemQty 
    , BillingItemDate 
) 
SELECT 
    24 
    , 1 
    , 'Room' 
    , CASE 
     WHEN CAST(GETDATE() AS TIME) <= '12:00' THEN QuotedRate * Nights 
     WHEN CAST(GETDATE() AS TIME) >= '13:00' THEN (QuotedRate * Nights) + (QuotedRate * Nights * .50) 
     ELSE (QuotedRate * Nights) + (QuotedRate * Nights * .50) 
     END 
    , 1 
    , GETDATE() 
FROM Folio 
WHERE FolioID = 24 

SQL Fiddleがダウンしているので、テーブルを作成してSQLをローカルに実行しました。下記参照。ここで

enter image description here

個々のSQLスクリプトがあります。あなたは、など、あなたのIDENTITYカラム

CREATE TABLE Billing (
    FolioID INT NOT NULL, 
    BillingCategoryID INT NULL, 
    BillingDescription VARCHAR(100) NOT NULL, 
    BillingAmount DECIMAL(9,2) NULL, 
    BillingItemQty NUMERIC(5,0) NULL, 
    BillingItemDate DATETIME NULL 
) 

CREATE TABLE Folio 
(
    FolioID INT NOT NULL, 
    QuotedRate DECIMAL(6,2) NOT NULL, 
    Nights INT NOT NULL 
) 

INSERT INTO Folio(FolioID, QuotedRate, Nights) 
VALUES (24, 100.00, 5) 

INSERT INTO Billing (
    FolioID 
    , BillingCategoryID 
    , BillingDescription 
    , BillingAmount 
    , BillingItemQty 
    , BillingItemDate 
) 
SELECT 
    24 
    , 1 
    , 'Room' 
    , CASE 
     WHEN CAST(GETDATE() AS TIME) <= '12:00' THEN QuotedRate * Nights 
     WHEN CAST(GETDATE() AS TIME) >= '13:00' THEN (QuotedRate * Nights) + (QuotedRate * Nights * .50) 
     ELSE (QuotedRate * Nights) + (QuotedRate * Nights * .50) 
     END 
    , 1 
    , GETDATE() 
FROM Folio 
WHERE FolioID = 24 

SELECT * FROM Billing 

のためにそれを修正したいかもしれないが、私はあなたのINSERT文の値として見るものだから、私はFolioID = 24を使用しました。しかし、このアプローチは任意のために使用することができますFolioID

次の条件は、1日の時間に基づいて正しい計算を行います。 「just in case」のデフォルト句も必要です。これは、下のELSE部分です。

SELECT 'Total Lodging' = 
    CASE 
    WHEN CAST(GETDATE() AS TIME) <= '12:00' THEN QuotedRate * Nights 
    WHEN CAST(GETDATE() AS TIME) >= '13:00' THEN (QuotedRate * Nights) + ((QuotedRate * Nights) * .50) 
    ELSE (QuotedRate * Nights) + ((QuotedRate * Nights) * .50) -- Default rate 
    END 
FROM Folio 

私は以下を参照してください、私のCASE文の作品を確実にするために、テーブルからSELECTが-INGのせずにSQL Serverの状態を使用していました。

enter image description here

+0

構文は 'CASE WHEN ... END AS" Total Lodging "'です。 'SELECT'節で' = 'を実行することはできません。またはこれまで。 – Andreas

+0

私はこれをテストしました。できます。 – Shiva

+0

一重引用符( '' ')を使用していますか?私は 'CASE'の数値を文字列に変換して' string-literal = string-value'の比較を行い、名前のない* boolean *値を得ることを期待しています。 – Andreas

関連する問題