[Перед тем как опубликовать этот вопрос, я ответил на множество вопросов.]

У меня есть таблица, содержащая 4 поля. Это ClientId, ClientName, ClientAddress, ClientCity .

Теперь у меня есть элемент управления текстовым полем автозаполнения, в котором мне нужно получить и отобразить имя клиента.

Проблема в том, что в нашей базе данных один и тот же клиент из одного города с другого адреса.

Теперь мне предъявлено требование, чтобы пользователь мог видеть «ClientName» или «ClientName + ClientCity» или «ClientName + ClientCity + ClientAddress», чтобы пользователю было проще выбрать клиента.

Это означает, что мне нужно добавить столбец в запрос, чтобы он стал уникальным.

Я уверен, что должно быть какое-то простое решение, которого я не получаю последние 2 дня.

Как показано в нижеприведенных примерах данных, если я покажу конечному пользователю только «D» в качестве имени клиента, он не сможет понять, какой клиент «D» он должен выбрать. Поэтому нам нужно объединить город и адрес, чтобы сделать его уникальным.

enter image description here

Я ожидаю результата, как показано ниже.

enter image description here

0
milan m 2 Мар 2015 в 09:48

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 .

1
Felix Pamittan 2 Мар 2015 в 07:28

ПОПРОБУЙ ЭТО,

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 )
0
KumarHarsh 2 Мар 2015 в 08:39

Если вы используете 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
0
Eralper 2 Мар 2015 в 07:37