在同一查询中使用GROUP,STUFF和CONTAINS

时间:2014-09-09 22:15:03

标签: sql sql-server

SELECT 
    callTrackingId, 
    count(id) AS orders,
    STUFF((SELECT ','+ reviewStatus FROM ct_callOrder WHERE callTRackingId=co.callTrackingId GROUP BY reviewStatus FOR XML PATH(''))  ,  1 , 1 , '' ) as status
FROM ct_callorder co with (nolock)
WHERE CONTAINS(status, 'NEEDS_REVIEW')
GROUP BY callTrackingId
ORDER BY callTrackinIid ASC

我有一个包含多行的表,其中一些具有相同的callTrackingId,我想要计算其中有多少行具有相同的trackingid。此外,我需要能够根据至少一个状态是否等于我正在寻找的状态来过滤它。我设法在列表中获取所有状态,但是当我尝试使用where where过滤它时,我得到一个错误。我猜测它,因为该列表可能是在调用where子句后创建的。关于如何过滤它的任何想法?

数据样本:

callTrackingId | reviewStatus 1 | NEEDS_REVIEW 1 | APPROVED 2 | APPROVED

因此,如果我按NEEDS_REVIEW过滤它,那么我应该

callTrackingId | count
1 | 2  

如果按APPROVED过滤,那么我应该

callTrackingId | count
1 | 2
2 | 1

感谢任何帮助, 谢谢

PS:DB是MSSQL 20xx

1 个答案:

答案 0 :(得分:2)

您可以使用HAVING根据汇总进行过滤,在这种情况下使用SUM()条件CASE

SELECT 
    callTrackingId, 
    count(callTrackingId) AS orders
FROM Table1 co
GROUP BY callTrackingId
HAVING SUM(CASE WHEN reviewStatus = 'NEEDS_REVIEW' THEN 1 END) >= 1

演示:SQL Fiddle