2016-07-16 5 views
1

Ich versuche, Werte in eine Fakturierungstabelle einzufügen. Für den BillingAmount möchte ich, dass sich das ändert, je nachdem, zu welcher Zeit der Gast auscheckt. Wenn der Gast vor Mittag auscheckt, möchte ich, dass der BillingAmount nur die QuotedRate ist, multipliziert mit der Anzahl der Übernachtungen. Wenn der Gast nach 13.00 Uhr auscheckt, möchte ich einen Zuschlag von 50% hinzufügen. Für die Check-Out-Zeit verwende ich nur die aktuelle Systemzeit. Einfach gesagt, ich versuche, eine IF-Anweisung in einer INSERT INTO-Abfrage zu verwenden. Ich bekomme jedoch immer Syntaxfehler um die IF-Anweisung. Wie würde ich dies formatieren, um Syntaxfehler zu vermeiden? Jede Hilfe wäre willkommen.Verwenden einer IF-Anweisung in einer INSERT INTO-Anweisung

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

Verwenden Sie 'CASE WHEN' Aussage. Aber ich denke, es ist besser, wenn Sie "Logik" in Ihrer Business-Schicht (.net) arbeiten und 'sql query' nur zum Speichern/Aktualisieren von Daten verwenden – Fabio

+0

Dies ist nicht direkt relevant für Antworten, aber was sollte der Gast berechnet werden wenn sie um 12:30 Uhr auschecken? –

Antwort

-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

es funktioniert nicht, wenn Folio mehrere Zeilen hat, seien Sie vorsichtig – Esperento57

2

Hier gehen Sie! Das ist dein 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 ist down, also habe ich Ihre Tabellen erstellt und lokal SQL ausgeführt. Siehe unten.

enter image description here

Hier sind die einzelnen SQL-Skripten. Vielleicht möchten Sie es etc. für Ihre Identity-Spalten ändern

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 

habe ich FolioID = 24, weil das ist, was ich als Wert in Ihrer INSERT Anweisung. Aber dieser Ansatz kann für alle FolioID

verwendet werden Die folgende Bedingung wird Ihnen die richtige Berechnung basierend auf der Tageszeit geben. Sie sollten auch eine Standardklausel "nur für den Fall" haben, die ELSE Teil unten ist.

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 

ich die Bedingung in SQL Server ohne SELECT-ing aus einer Tabelle verwendet, um meine CASE Aussage Werke sicherzustellen, siehe unten.

enter image description here

+0

Syntax ist 'CASE WHEN ... END AS" Total Lodging "'. Sie können ' = ' in einer 'SELECT' Klausel nicht tun. Oder jemals. – Andreas

+0

Nein. Ich habe das getestet. Es klappt. – Shiva

+0

Verwenden von einfachen Anführungszeichen ('' ')? Ich würde erwarten, dass der numerische Wert aus dem 'CASE' in einen String umgewandelt wird und dann der Vergleich' string-literal = string-value' durchgeführt wird, was zu einem unbenannten * boolean * -Wert führt. – Andreas

Verwandte Themen