2015-04-02 161 views
0

我的数据库有一个简单的表格,有两列,BID和Value。有可能是在相同的出价数据库中的一些记录,像这样:如何编写SQL查询?

投标金额

Record1: BID = 1, Value = 0 

Record2: BID = 1, Value = 3 

Record3: BID = 2, Value = 4 

Record4: BID = 2, Value = 5 

Record5: BID = 2, Value = 6 

Record6: BID = 3, Value = 7 

现在我想写一个SQL查询,可以得到有更多的BID的总数比一个相应的记录。

在上述样品,BID 1具有2条相应的记录,和BID 2具有3。因此,其具有多于一个的相应的记录BID值的总数是2。

如何写这样的SQL查询?

+0

您已用COUNT()列出了一个关键字。你应该寻找的其他人是'HAVING'和'GROUP BY'。 – Sirko 2015-04-02 06:45:21

+0

您在这里使用MySQL或SQL Server吗?我认为其中一个答案是产品特定的...这是一个好主意,不标记未使用的产品! – jarlh 2015-04-02 06:58:57

+0

我刚刚针对mysql和sql server进行了测试,对两者都适用,因此在那里很安全 – 2015-04-02 07:06:01

回答

2

您正在查找聚合查询。

SELECT COUNT(*) 
    FROM (
    SELECT BID, COUNT(*) cnt 
     FROM your_table 
     GROUP BY BID 
     HAVING COUNT(*) > 1 
) q 

这里的内部查询将您的出价组合在一起,计算每个组中的数量,然后仅选择具有多于1个值的组。

外部查询只计算该查询的结果。

你可以看到它是如何工作在这里:http://sqlfiddle.com/#!9/0c9e6/3

+1

而且您甚至不需要在子查询中选择count(*),它仍然可以工作。 – jarlh 2015-04-02 06:55:55

+1

的确如此,它显示了内部查询的工作原理 – 2015-04-02 06:56:42

+0

谢谢,最后一个“q”的用法是什么? – alancc 2015-04-06 07:49:56

0
declare @t table (bid int,val int) 
insert into @t (bid,val)values (1,0),(1,3),(2,4),(2,5),(2,6),(3,7) 

;with cte as (
select bid, 
     val,ROW_NUMBER()OVER(PARTITION BY bid order by val)RN from @t 
) 
select COUNT(DISTINCT bid) from cte 
where RN > 1 
0

你只有2 count一个需要检查值的每个ID和计数,另一个用于谁拥有超过一个值,你不要所有ID无需使用having

SELECT COUNT(*) 
FROM (
    SELECT BID, COUNT(*) CNT 
    FROM your_table 
    GROUP BY BID 
) q 
WHERE CNT>1 
+0

我不认为即使mysql足够愚蠢,不会意识到select中的count(*)与having中的count(*)完全相同,并且只会将其删除一次。实际上,这个查询和我的版本的执行计划是相同的 – 2015-04-02 07:11:14