MadMyche
Не могли бы вы, возможно, намеревались использовать Поле totaldue вместо равновесия? Это изменило бы ваше заявление, чтобы выглядеть следующим образом:
SELECT [InvoiceNo], [Date], [CustmID], [TotalDue]
, [Status] = CASE
WHEN [TotalDue] >0 THEN 'Pending'
WHEN [TotalDue] =0 THEN 'Paid'
END
FROM [dbo].[Sale_Bill_details]
Однако у меня есть проблема с этим, так как это не компенсирует того, кто переплатил и имеет отрицательный баланс. Вы должны использовать оператор ELSE или альтернативно изменить вторую строку:
-- using ELSE
SELECT [InvoiceNo], [Date], [CustmID], [TotalDue]
, [Status] = CASE
WHEN [TotalDue] > 0 THEN 'Pending'
WHEN [TotalDue] < 0 THEN 'Paid'
ELSE 'Credit Due'
END
FROM [dbo].[Sale_Bill_details]
-- alternative
SELECT [InvoiceNo], [Date], [CustmID], [TotalDue]
, [Status] = CASE
WHEN [TotalDue] > 0 THEN 'Pending'
WHEN [TotalDue] <=0 THEN 'Paid'
END
FROM [dbo].[Sale_Bill_details]
Но у меня все еще есть проблемы с этим - поскольку [статус] ("ожидание", "оплачено", "кредит причитается") является элементом презентации; и обычно он не должен ни сохраняться, ни вычисляться в базе данных.
Разделение проблем для меня говорит о том, что БД используется для отображения данных. Приложение и его друг конец возвращают данные и выбирают, что из них отображать.
Дополнение После просмотра кода из-за ошибки, указанной мне, я обнаружил две ошибки в вашем случае statement1. Если вы определяете
состояние во вступительном заявлении он не может быть использован в операторе WHEN
2. TSQL использует один знак равенства для равенства и присвоения, ваш второй, когда использует ==
3. Там нет конца, чтобы оператор Case.
, case Balance when Balance >0 then 'Pending' when Balance == 0 then 'Paid'
-- above line will error out. SQL Studio and Sql Ops Studio will flag the errors
, case when Balance >0 then 'Pending' when Balance = 0 then 'Paid' END
доказательство концепции вместе с тем, включив мое рекомендуемое заявление CASE вместе с оригинальным (его нужно будет прокомментировать) и простое исправление плохого заявления
DECLARE @Sample TABLE (InvoiceNo INT NULL, [Date] DATE NULL, Custom ID INT NULL, TotalDue MONEY NULL, Balance MONEY NULL)
INSERT @Sample
VALUES (1, GetDate(), 1, 123, 123)
, (2, GetDate(), 2, 123, 0)
, (3, GetDate(), 3, 123, -123)
, (4, GetDate(), 4, 0, null )
SELECT [InvoiceNo]
,[Date]
,[CustomID]
,[TotalDue]
, [Status] = case
when Balance > 0 then 'Pending'
when Balance = 0 then 'Paid'
when Balance < 0 then 'Credit Due'
else 'na'
END
, case Balance when Balance >0 then 'Pending' when Balance == 0 then 'Paid'
, case when Balance >0 then 'Pending' when Balance = 0 then 'Paid' END
FROM @Sample
Запуск этого (с плохой закомментированной строкой) вернет что-то вроде этого:
InvoiceNo Date CustomID TotalDue Status (No column name)
1 2018-11-02 1 123.00 Pending Pending
2 2018-11-02 2 123.00 Paid Paid
3 2018-11-02 3 123.00 Credit Due NULL
4 2018-11-02 4 0.00 na NULL