2016-06-29 6 views
0

мне нужно создать функцию SQL Server, который принимает BillID в качестве параметра и возвращает таблицу (должна быть только одна строка), которая перечисляет QuotedRate (ОБЯЗАТЕЛЬНО) и DiscountAmount ИЛИ DiscountPercent, но НЕ оба.SQL Server: Display Column, если NOT NULL

Каждый BillID либо имеет DiscountAmount ИЛИ DiscountPercent, но НЕ оба. Один из них будет NULL.

Как вернуть таблицу, в которой перечислены QuotedRate вместе с одним из вышеупомянутых столбцов Discount (в зависимости от того, какой из них не равен NULL)? Любая помощь будет оценена по достоинству.

Вот мой код до сих пор:

CREATE FUNCTION dbo.fn_ApplyDiscounts(@BillID smallint) 
RETURNS TABLE 
AS 
    --IF DiscountAmount IS NOT NULL 
    RETURN (SELECT QuotedRate, DiscountAmount 
      FROM Bill 
      AND BillID = @BillID) 

    --ELSE IF DiscountPercent IS NOT NULL 

    RETURN (SELECT QuotedRate, DiscountPercent 
      FROM Bill 
      AND BillID = @BillID) 
+1

Что произойдет, если и 'DiscountAmount', и' DiscountPercent' являются 'NULL' –

ответ

0

Я на своем мобильном телефоне, так что это немного трудно набрать код. Вам просто нужно использовать функцию coalesce. Следовательно, вам нужен только один выбор:

RETURN (SELECT QuotedRate, coalesce(DiscountAmount, DiscountPercent) FROM Bill WHERE BillID = @BillID) 
0

Ваша проблема не в SQL, это в логике.

Вы должны обращаться

No Rate & No Amount 
No Rate & Amount 
Rate & No Amount 
Rate & Amount 

Ваша логика должна работать нормально. Вы можете использовать операторы IF или SELECT, вам просто нужно решить, что вы будете делать в каждом случае.

0

Я добавил колонку TYPE, чтобы вы знали, является ли она количеством или процентом. Я думаю, что это будет полезно для вашего дела. Кроме того, в случае, если сумма и проценты равны нулю, это тоже должно работать.

CREATE FUNCTION dbo.fn_ApplyDiscounts(@BillID smallint) 
    RETURNS 
    @ReturnTable TABLE(
    QuotedRate decimal(8,2), 
    Discount decimal (8,2), 
    TheType char(1)  
    ) 

    AS 
    BEGIN 

    INSERT INTO @ReturnTable (QuotedRate, Discount, TheType) 
    SELECT 
    QuotedRate, 
    COALESCE(DiscountAmount, DiscountPercent, '') as Discount, 
    CASE 
     WHEN DiscountAmount IS NOT NULL THEN'A' 
     WHEN DiscountPercent IS NOT NULL THEN 'P' 
     ELSE NULL 
    END as TheType 
    FROM Bill 
    WHERE BillID = @BillID 

RETURN 
END