Sql server 使用GROUP BY时需要返回表中的所有列

Sql server 使用GROUP BY时需要返回表中的所有列,sql-server,tsql,Sql Server,Tsql,我有一个表,假设它有四列 Id、名称、单元号、Cat\u Id。 我需要返回Cat\u id计数大于1的所有列 分组应在单元号和名称上进行。 到目前为止我所做的 select Cell_no, COUNT(Cat_id) from TableName group by Cell_Number having COUNT(Cat_id) > 1 但我需要的是这样的东西 select * from TableName group by Cell_Number having COUNT(Cat

我有一个表,假设它有四列
Id、名称、单元号、Cat\u Id
。 我需要返回
Cat\u id
计数大于
1
的所有列

分组应在
单元号
名称
上进行。 到目前为止我所做的

select Cell_no, COUNT(Cat_id)
from TableName
group by Cell_Number
having COUNT(Cat_id) > 1
但我需要的是这样的东西

select * 
from TableName
group by Cell_Number
having COUNT(Cat_id) > 1

您只需要像下面这样修改您的查询--


如前所述,您希望按单元格编号和名称分组。。如果是这样,您需要更改对“分组方式”列的查询,并选择“部分”。。正如我所提到的,此版本只需要对数据进行一次传递:

SELECT *
FROM   (SELECT a.*
              ,COUNT(cat_id) OVER (PARTITION BY cell_no)
               AS count_cat_id_not_null
        FROM   TableName a)
WHERE  count_cat_id_not_null > 1;

Pratik的答案很好,但与其在操作符中使用
(仅适用于单个值),您需要像这样将
连接到结果集

SELECT t.* 
FROM tableName t
INNER JOIN      
    (SELECT Cell_no, Name 
    FROM TableName
    GROUP BY Cell_no , Name
    HAVING COUNT(Cat_id) > 1) filter
    ON t.Cell_no = filter.Cell_no AND t.Name = filter.Name

我认为您的意思是“返回Cat_id计数大于1的所有行”?是的,但需要检查这些列是否具有相同的Cell_no或nameCorrect逻辑,但
IN运算符适用于单个值,而不是元组。在oracle中,您也可以应用并检查多个列的IN运算符。。所以这就是我写这篇文章的原因…谢谢pratik,对不起,我不是故意批评它在TSQL中对我不起作用。我已经很多年没有使用Oracle了……当我检查这个执行计划时,它包含2个内部联接,而我的包含1个内部联接。速度也慢了30%。我很惊讶。我怀疑您的内部联接是通过某些索引实现的,是吗?请注意,当我在SQL 2008 R2上运行此操作时,我需要向内部结果集添加一个别名以执行。Kirk Broadhurst,,IN运算符可以很好地处理oracle数据库中的多列组合。。对不起我没有检查是否在SQL SQServer中也可以使用相同的功能:)
SELECT t.* 
FROM tableName t
INNER JOIN      
    (SELECT Cell_no, Name 
    FROM TableName
    GROUP BY Cell_no , Name
    HAVING COUNT(Cat_id) > 1) filter
    ON t.Cell_no = filter.Cell_no AND t.Name = filter.Name