[Перед тем как опубликовать этот вопрос, я ответил на множество вопросов.]
У меня есть таблица, содержащая 4 поля. Это ClientId, ClientName, ClientAddress, ClientCity .
Теперь у меня есть элемент управления текстовым полем автозаполнения, в котором мне нужно получить и отобразить имя клиента.
Проблема в том, что в нашей базе данных один и тот же клиент из одного города с другого адреса.
Теперь мне предъявлено требование, чтобы пользователь мог видеть «ClientName» или «ClientName + ClientCity» или «ClientName + ClientCity + ClientAddress», чтобы пользователю было проще выбрать клиента.
Это означает, что мне нужно добавить столбец в запрос, чтобы он стал уникальным.
Я уверен, что должно быть какое-то простое решение, которого я не получаю последние 2 дня.
Как показано в нижеприведенных примерах данных, если я покажу конечному пользователю только «D» в качестве имени клиента, он не сможет понять, какой клиент «D» он должен выбрать. Поэтому нам нужно объединить город и адрес, чтобы сделать его уникальным.
Я ожидаю результата, как показано ниже.
3 ответа
Вы можете использовать COUNT() OVER()
для этого:
;WITH CTE AS(
SELECT *,
ByName = COUNT(*) OVER(PARTITION BY ClientName),
ByCity = COUNT(*) OVER(PARTITION BY ClientName,ClientCity)
FROM Client
)
SELECT
CASE
WHEN ByName = 1 AND ByCity = 1 THEN ClientName
WHEN ByName > 1 AND ByCity = 1 THEN ClientName + ', ' + ClientCity
WHEN ByName > 1 AND ByCity > 1 THEN ClientName + ', ' + ClientCity + ', ' + ClientAddress
END
FROM CTE
ORDER BY ClientID
< Сильный > РЕЗУЛЬТАТ
Client
--------------------------------------------------------
A
B
C, New York
D, London, LSE Houghton Streen London WC2A 2AE
D, London, Hard Rock Cafe London 150 Old Park Lane
F
C, Paris
См. SQL Fiddle .
ПОПРОБУЙ ЭТО,
Declare @t table (clientid int identity(1,1),clientname varchar(50),clientCITY varchar(50)
,clientaddress varchar(200))
insert into @t values ('A','PARIS','DFSDFSDF'), ('C','NEW YORK','DFSDFSDF')
,('C','PARIS','WEQWEQWE'),('D','LONDON','QWE342'),('D','LONDON','21DXCXZC')
;With CTE as
(select *,ROW_NUMBER()over(partition by clientname order by clientid)rn
,ROW_NUMBER()over(partition by clientname,ClientCity order by clientid)rn1
from @T A
)
--select * from cte
select clientname+','+ clientCITY
from cte A WHERE
EXISTS(SELECT CLIENTID FROM CTE WHERE clientname=A.clientname AND RN>1 AND RN1<=1)
UNION ALL
select clientname+','+ clientaddress
from cte A WHERE
EXISTS(SELECT CLIENTID FROM CTE WHERE clientname=A.clientname AND RN1>1)
UNION ALL
select clientname
from cte A WHERE not
EXISTS (SELECT CLIENTID FROM CTE WHERE clientname=A.clientname AND RN>1 )
Если вы используете SQL Server, вы можете попробовать объединение строк с помощью оператора «+» следующим образом
select
ClientName + ', ' + ClientCity + ', ' + ClientAddress as ClientData,
Concat(ClientName, ', ', ClientCity, ', ', ClientAddress) Client
from client
Вторая конкатенация построена с использованием SQL Функция CONCAT () будет работать в SQL Server 2012 и более поздних версиях.
Для условных данных может помочь следующий оператор SELECT,
select
-- ClientName + ', ' + ClientCity + ', ' + ClientAddress as ClientData,
-- Concat(ClientName, ', ', ClientCity, ', ', ClientAddress) ClientDtata2,
client =
case when count(*) over (partition by ClientName) = 1 then ClientName
else
case when count(*) over (partition by ClientName, ClientCity) = 1 then CONCAT(ClientName, ', ' , ClientCity)
else Concat(ClientName, ', ', ClientCity, ', ', ClientAddress)
end
end
from client
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными.