2016-07-16 5 views
1

값 테이블에 값을 삽입하려고합니다. 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

다음 조건은 시간대에 따라 정확한 계산을 제공합니다. "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는 - 보내고없이 SQL Server의 조건을 사용, 아래를 참조하십시오.

enter image description here

+0

구문은 'CASE WHEN ... END AS "Total Lodging"입니다. 'SELECT' 절에서' = '을 사용할 수 없습니다. 아니면 – Andreas

+0

Nope. 나는 이것을 시험했다. 그것은 작동합니다. – Shiva

+0

작은 따옴표 (''') 사용? 'CASE'의 숫자 값을 문자열로 강제 변환 한 다음'string-literal = string-value' 비교를 수행하여 이름이 지정되지 않은 * 부울 값 *을 얻게 될 것으로 기대합니다. – Andreas