我有一张Contacts
基本上如下所示的表:
Id | Name | ContactId | Contact | Amount
---------------------------------------------
1 | A | 1 | 12323432 | 555
---------------------------------------------
1 | A | 2 | 23432434 | 349
---------------------------------------------
2 | B | 3 | 98867665 | 297
--------------------------------------------
2 | B | 4 | 88867662 | 142
--------------------------------------------
2 | B | 5 | null | 698
--------------------------------------------
在这里,ContactId
整个表格都是唯一的。Contact
可以是NULL
&我想排除那些。
现在,我想根据其ID为每个ID选择排名前5位的联系人Amount
。我通过以下查询来完成:
WITH cte AS (
SELECT id, Contact, amount, ROW_NUMBER()
over (
PARTITION BY id
order by amount desc
) AS RowNo
FROM contacts
where contact is not null
)
select *from cte where RowNo <= 5
到目前为止,一切正常。现在,我想将每个组的这些记录(<= 5)串联起来,并通过串联将它们显示在一行中。
预期结果 :
Id | Name | Contact
-------------------------------
1 | A | 12323432;23432434
-------------------------------
2 | B | 98867665;88867662
我正在使用以下查询来实现这一点,但它仍然在单独的行中提供所有记录,并且还包括Null
值:
WITH cte AS (
SELECT id, Contact, amount,contactid, ROW_NUMBER()
over (
PARTITION BY id
order by amount desc
) AS RowNo
FROM contacts
where contact is not null
)
select *from id, name,
STUFF ((
SELECT distinct '; ' + isnull(contact,'') FROM cte
WHERE co.id= cte.id and co.contactid= cte.contactid
and RowNo <= 5
FOR XML PATH('')),1, 1, '')as contact
from contacts co inner join cte where cte.id = co.id and co.contactid= cte.contactid
上面的查询仍然为我提供了差异行中的所有前5位联系人,也包括null。
使用CTE
和STUFF
聚在一起是个好主意吗?请提出是否有比此更好的方法。
我的最终查询出现问题:
我不需要Contact
在决赛中使用原始表格Select
,因为我已经拥有所需的所有东西CTE
。另外,Inside STUFF()
,我正在使用contactid
加入,这实际上是我在这里尝试进行的连接。由于我使用该条件进行联接,因此我在diff行中获取记录。我已经删除了这两个条件,并且它起作用了。
WITH cte AS (
SELECT id, Contact, amount,contactid, ROW_NUMBER()
over (
PARTITION BY id
order by amount desc
) AS RowNo
FROM contacts
where contact is not null
)
select *from id, name,
STUFF ((
SELECT distinct '; ' + isnull(contact,'') FROM cte
WHERE co.id= cte.id
and RowNo <= 5
FOR XML PATH('')),1, 1, '')as contact
from cte where rowno <= 5
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句