Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于查找具有相同值集的行的SQL查询_Sql_Sql Server_Database_Tsql - Fatal编程技术网

用于查找具有相同值集的行的SQL查询

用于查找具有相同值集的行的SQL查询,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,假设我有下表 Customer_ID Item_ID 1 A 1 B 2 A 2 B 3 A 我需要的是找到购买同一套商品的客户。 输出: id1

假设我有下表

Customer_ID  Item_ID
1            A
1            B
2            A
2            B
3            A
我需要的是找到购买同一套商品的客户。 输出:

id1 如果有两个以上的客户具有相同的项目集,例如三个,则输出必须是下一个:

Customer_id  Customer_id
id1          id2
id2          id3
id1          id3

谢谢,试试这个。其思想是利用外部联接和count忽略null的事实

select t1.customer_id, t2.customer_id
from tbl t1
left join tbl t2
on t1.customer_id < t2.customer_id
and t1.item_id = t2.item_id
group by t1.customer_id, t2.customer_id
having count(t1.item_id) = count(t2.item_id)
就你而言:

create table CustomerAA (
    Customer_Id int ,
    ItemId varchar(10)
    );

Insert Into CustomerAA(Customer_Id,ItemId) values(1,'A')
Insert Into CustomerAA(Customer_Id,ItemId) values(1,'B')
Insert Into CustomerAA(Customer_Id,ItemId) values(2,'A')
Insert Into CustomerAA(Customer_Id,ItemId) values(2,'B')
Insert Into CustomerAA(Customer_Id,ItemId) values(3,'A')
您可以像上面那样使用左连接:

Select Distinct C1.Customer_Id , C2.Customer_Id
From CustomerAA As C1
Left Join CustomerAA As C2 on ( C1.ItemId = C2.ItemId )
Where
    ( C1.Customer_Id < C2.Customer_Id )


我找到了解决问题的办法。 首先,我创建了临时表。此teable有一列,列中有每个客户购买的不同项目的数量。 看起来是这样的:

Customer_ID Item_Id num
1           A       2
1           B       2 
2           A       2
2           B       2
3           A       1
下一个是查询

声明@tmp表 客户ID int, 物品编号nvarcharmax, num int 插入@tmp 选择tbl.Customer\u Id、tbl.ItemId、A.num 来自tbl 内连接 选择Customer_Id,COUNTDISTINCT ItemId作为num 来自tbl 按客户标识A分组 在tbl.Customer\u Id=A.Customer\u Id上 之后,我使用下一个查询

选择t1.Customer\u Id,t2.Customer\u Id 来自@tmp t1 内部连接@tmp t2 在t1.Customer\u Id
Customer_ID Customer_ID 
1           2       

中间有一个枚举,但相同的事物

with cte as ( SELECT [sID], [enumID], [valueID], count(*) over (partition by [sID], [enumID]) as ccount
                FROM [docMVenum1] 
               WHERE [sID] < 10000 ) 
select [cte1].[sID], [cte2].[sID], [cte1].[enumID] -- , [cte1].[valueID], [cte1].[ccount]
  from cte as [cte1] 
  join cte as [cte2] 
    on [cte1].[sID] < [cte2].[sID] 
   and [cte1].[enumID]  = [cte2].[enumID]
   and [cte1].[valueID] = [cte2].[valueID]
   and [cte1].[ccount]  = [cte2].[ccount]
 group by [cte1].[sID], [cte2].[sID], [cte1].[enumID], [cte1].[ccount]
having count(*) =  [cte1].[ccount]
 order by [cte1].[sID], [cte2].[sID] --, [cte1].[enumID], [cte1].[valueID];

C1.Item_ID=C2.Item_ID并不意味着集合相等。在上面的示例中,客户1和客户2具有相同的项目集。但是第二名和第三名并不相等。你们有sql server 2012吗?
Select Distinct C1.Customer_Id , C2.Customer_Id
From CustomerAA As C1
Inner Join CustomerAA As C2 
    on ( 
           ( C1.ItemId = C2.ItemId ) 
           And 
           ( C1.Customer_Id < C2.Customer_Id ) 
       )
Customer_ID Item_Id num
1           A       2
1           B       2 
2           A       2
2           B       2
3           A       1
Customer_ID Customer_ID 
1           2       
with cte as ( SELECT [sID], [enumID], [valueID], count(*) over (partition by [sID], [enumID]) as ccount
                FROM [docMVenum1] 
               WHERE [sID] < 10000 ) 
select [cte1].[sID], [cte2].[sID], [cte1].[enumID] -- , [cte1].[valueID], [cte1].[ccount]
  from cte as [cte1] 
  join cte as [cte2] 
    on [cte1].[sID] < [cte2].[sID] 
   and [cte1].[enumID]  = [cte2].[enumID]
   and [cte1].[valueID] = [cte2].[valueID]
   and [cte1].[ccount]  = [cte2].[ccount]
 group by [cte1].[sID], [cte2].[sID], [cte1].[enumID], [cte1].[ccount]
having count(*) =  [cte1].[ccount]
 order by [cte1].[sID], [cte2].[sID] --, [cte1].[enumID], [cte1].[valueID];