#sql #sql-server
Вопрос:
Пытаюсь понять, как изменить это С ПОМОЩЬЮ оператора CTE AS. То, что у меня есть ниже, обновит мой StackCustomerAltID численно с клиентами в порядке ABC, которые не являются пустыми и Delflg = 0. Но мне нужно выяснить, как изменить его, чтобы обновить мой StackCustomerAltID численно, клиенты в порядке ABC с пустыми клиентами. Но проблема, похоже, в пробелах. Я попытался удалить предложение where, но оно сначала помещает пробелы, а затем те, в которых есть реальные клиенты.
Существующий запрос
WITH CTE AS( SELECT StackCustomerAltID, ROW_NUMBER() OVER (ORDER BY Customer) AS RN FROM dbo.StackCustomer Where DelFlg = 0 and Customer lt;gt; '') UPDATE CTE SET StackCustomerAltID = RN;
без пункта «где»
WITH CTE AS( SELECT StackCustomerAltID, ROW_NUMBER() OVER (ORDER BY Customer) AS RN FROM dbo.StackCustomer ) UPDATE CTE SET StackCustomerAltID = RN;
Комментарии:
1. Вы хотите изменить порядок присвоения номеров, чтобы пробелы получали самые высокие номера вместо самых низких?
2. да, те, у которых имена клиентов в порядке abc, а затем пустые
Ответ №1:
Как насчёт:
WITH CTE AS ( SELECT StackCustomerAltID, ROW_NUMBER() OVER ( ORDER BY CASE WHEN Customer Is Null THEN 1 ELSE 0 END, Customer ) AS RN FROM dbo.StackCustomer ) UPDATE CTE SET StackCustomerAltID = RN;
Комментарии:
1. Это правильный подход. Однако я думаю, что это можно сделать проще с помощью
ORDER BY Customer IS NULL, Customer
2. пустые клиенты на самом деле пустые, а не пустые, я предполагаю, что тогда это не сработает?
3. @JShaffer Вам просто нужно заменить
Customer Is Null
наCustomer = ''
.4. @Cargo23 Этот синтаксис не работает для меня в SQL Server 2016.
5. это сработало, когда я изменил его на Customer = »