2012-11-29 90 views
0

我有一个列表的数据需要进行分组,但我们只希望将数据计数大于3首先SQL Server组然后取消组合?

AA 
AA 
BB 
CCC 
CCC 
CCC 

回报

AA 1 
AA 1 
BB 1 
CCC 3 

谢谢您的帮助

+1

我想我需要更多的去这里 - 所以,你有一个字符串列表,你只想显示长度大于3的那些?或者出现三次以上?或两者? – Hotchips

回答

2

关闭我的头顶,您可以使用计数大于2的计数,然后使用UNION ALL获取不在第一个查询中的任何记录:

SELECT 'AA' AS Data 
INTO #Temp 
UNION ALL SELECT 'AA' 
UNION ALL SELECT 'BB' 
UNION ALL SELECT 'CCC' 
UNION ALL SELECT 'CCC' 
UNION ALL SELECT 'CCC' 

SELECT Data, COUNT(Data) AS MyCount 
FROM #Temp 
GROUP BY Data 
HAVING COUNT(Data) > 2 

UNION ALL 

SELECT Data, 1 
FROM #Temp 
WHERE Data NOT IN (
    SELECT Data 
    FROM #Temp 
    GROUP BY Data 
    HAVING COUNT(Data) > 2 
) 
ORDER BY Data 

DROP TABLE #Temp 
2
select data, case when total < 3 then 1 else total end total 
from 
    (
     select data, Count(Data) Total 
     from tbl 
     group by data 
    ) g 
join (select 1 union all select 2) a(b) 
    on a.b <= case when total < 3 then Total else 1 end 
order by data 

大部分时间这应该比LittleBobbyTables的回答快。

+0

+1,这几乎把我的水从水里吹出来,非常好。 – LittleBobbyTables

0

使用窗函数为这样:

select col, count(*) as cnt 
from (select col, count(*) over (partition by col) as colcnt, 
      row_number() over (order by (select NULL)) as seqnum 
     from t 
    ) t 
group by col, (case when colcnt < 3 then seqnum else NULL end) 

此计算在所述列和每行的唯一标识符的总数。然后按组条件测试条件。如果小于3,那么它使用标识符来获取每一行。如果更大,在这种情况下它使用一个常量值(NULL)。