2015-03-02 5 views
0

[Я прошел через большое количество вопросов, прежде чем отправлять на этот вопрос.]SQL Query для отображения уникальных записей на основе определенных условий

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

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

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

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

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

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

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

enter image description here

Я ожидаю выход, как показано ниже.

enter image description here

+0

Ваш вопрос непонятен. Просьба уточнить, предоставив образцы данных и ожидаемые результаты –

+0

Я добавляю изображение. Пожалуйста, подождите. –

+0

@wewesthemenace, я отредактировал сообщение. –

ответ

1

Вы можете использовать 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.

+0

Ничего себе. Это превосходно. Большое спасибо. Большое спасибо. –

+0

Нет проблем. Пожалуйста, примите это как ответ, если он решает вашу проблему. –

+0

Еще один вопрос. Как получить ClientId также в результатах? –

0

Если вы используете SQL Server, вы можете попробовать конкатенации, используя оператор «+» следующим

select 
    ClientName + ', ' + ClientCity + ', ' + ClientAddress as ClientData, 
    Concat(ClientName, ', ', ClientCity, ', ', ClientAddress) Client 
from client 

Второй конкатенации построен с использованием SQL CONCAT() funtion будет работать на SQL Server 2012, а затем

Для условных данных следующего ЗЕЬЕСТ может помочь,

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

TRY ЭТОГО,

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) 
Смежные вопросы