2015-03-02 136 views
0

[我已经通过大量的问题张贴了这个问题之前。]SQL查询基于特定条件显示唯一的记录

我有一个包含4个字段的表。它是ClientId,ClientName,ClientAddress,ClientCity

现在,我有一个自动完成的文本框控件,我需要获取&显示客户端名称。

问题是,在我们的数据库中,我们有来自不同地址的同一个城市的客户端。

现在对我的要求是用户应该能够看到“ClientName”或“ClientName + ClientCity”或“ClientName + ClientCity + ClientAddress”,以便用户选择客户端。

这意味着我需要添加一列到查询,直到它使它唯一。

我相信肯定有一些简单的解决方案,这是我过去两天没有得到的。

如下面的示例数据所示,如果我只向最终用户显示“D”作为客户端名称,他会因为他必须选择哪个客户端“D”而感到困惑。所以我们需要连接城市和地址以使其独一无二。

enter image description here

我下面预期的输出。

enter image description here

+0

你的问题不清楚。请通过提供样本数据和预期结果来澄清 – 2015-03-02 06:51:13

+0

我正在添加图像。请稍候。 – 2015-03-02 06:52:14

+0

@wewesthemenace,我编辑了这篇文章。 – 2015-03-02 06:59:58

回答

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

哇。这是一流的。非常感谢。非常感谢你。 – 2015-03-02 07:28:04

+0

没问题。如果它解决了你的问题,请接受这个答案。 – 2015-03-02 07:29:26

+0

还有一个问题。如何在输出中获得ClientId? – 2015-03-02 07:37:19

0

如果您正在使用SQL Server,你可以使用“+”操作符如下

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

第二个串联使用SQL CONCAT() funtion建成将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

试试这个,

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)