没有分组的SQL计数?

时间:2014-06-03 13:34:32

标签: sql

我有以下数据,我需要帮助查询SQL过滤器:

Table1

A     B
1     1
1     2
1     3
2     1
3     1 
3     2
4     1
5     1 
5     2
5     3

我需要一个查询的帮助,当B的计数(不是值)大于1但我不想要分组时,该查询只返回A和B中的数据。例如:

A     B
1     1
1     2
1     3
3     1 
3     2
5     1 
5     2
5     3

通知2&缺少4个,因为它们只有B列中的一个计数。

这是我到目前为止所做的:

SELECT Table1.A, Count(Table1.B) AS [Count of B]
FROM Table1
GROUP BY Table1.A
HAVING (((Count(Table1.[B]))>1))
ORDER BY A

然而我无法摆脱GROUP BY声明!!

有人可以协助吗?

非常感谢

6 个答案:

答案 0 :(得分:0)

以下是使用标准SQL的一种方法:

select t.*
from table1 t
where (select count(*) from table1 t2 where t2.a = t.a) > 1

答案 1 :(得分:0)

这样做的一种方法是隐藏子查询中的分组,因此您的主查询不会被分组:

SELECT *
FROM   table1
WHERE  b IN (SELECT   b
             FROM     table1
             GROUP BY b
             HAVING   COUNT(*) > 1)

答案 2 :(得分:0)

SELECT Table1.*
FROM Table1
WHERE Table1.A IN 
(
  SELECT Table1.A
  FROM Table1
  GROUP BY Table1.A
  HAVING Count(Table1.B) > 1
)

答案 3 :(得分:0)

如果您的B列只有不同的值(或者您有其他行idwntifier),则无需分组即可执行特定任务:

select
    t.A, t.B
from Table1 as t
where
        exists (
            select *
            from Table1 as tt
            where tt.A = t.A and tt.B <> t.B
        )

至于更一般的答案 - 你可以使用窗口函数(如果你的RDBMS支持它),比如

with cte as (
    select *, count(*) over(partition by A) as cnt
    from Table1
)
select A, B
from Table1
where cnt > 1

答案 4 :(得分:0)

count()结束,分区依据将完成工作

SELECT tbl1.*
  FROM (SELECT COUNT (1) OVER (PARTITION BY tbl.B) cnt, tbl.*
          FROM Table1 tbl) tbl1
 WHERE tbl1.cnt > 1

答案 5 :(得分:0)

这不会完全摆脱GROUP BY,但会在子查询中执行,因此您的结果将与您希望的一样:

SELECT A, B
FROM Table1
WHERE NOT A IN(
    SELECT A 
    FROM Table1
    GROUP BY A
    HAVING COUNT(B) = 1
)
ORDER BY A