Fahid Zahoor Ответов: 2

Как можно использовать оператор case в SQL


привет каждому, кто пытается получить те записи, у которых сумма баланса равна 0, а сумма баланса больше 0, то есть баланс>0 как "статистика"
если сумма остатка равен 0, то его показывают, его статистика будет "оплачен", если сумма остатка больше 0, то это показывает статистика как Painding'
пожалуйста кто нибудь скажите мне как я могу это сделать
Я пытаюсь это сделать, но не могу получить желаемый результат

Что я уже пробовал:

SELECT [InvoiceNo]
      ,[Date]      
      ,[CustmID]    
      ,[TotalDue]	   
     ,case Balance when Balance>0 then 'Pending'  when  Balance==0 then  'Paid'	  	   
  FROM [dbo].[Sale_Bill_details]

CHill60

Покажите некоторые примеры данных - от вашего комментария к решению 1 это звучит так, как будто у вас нет столбца с именем Balance

2 Ответов

Рейтинг:
2

Member 13915320

SELECT [InvoiceNo]
      ,[Date]      
      ,[CustmID]    
      ,[TotalDue]	   
     ,  case 
		when Balance>0 then 'Pending'  
		when  Balance=0 then  'Paid'	  	   
	end case
  FROM [dbo].[Sale_Bill_details]


Fahid Zahoor

По-прежнему дают ошибку под всеми столбцами, ошибка-это недопустимое имя столбца
когда я использую case то эта ошибка приходит когда я удаляю case то ошибка также удаляется автоматически me b некоторые проблемы все еще возникают в случае
любое предложение

Рейтинг:
0

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


Richard Deeming

Не должно быть "дела" после "конца". :)
CASE (Transact-SQL) | Microsoft Docs[^]

MadMyche

Исправлено, я действительно должен научиться не копировать/вставлять, не просмотрев весь код. И теперь я вижу, что первоначальное сообщение тоже не имеет конца по этому делу.