如何编写SQL查询?
问题描述:
我的数据库有一个简单的表格,有两列,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查询?
答
您正在查找聚合查询。
SELECT COUNT(*)
FROM (
SELECT BID, COUNT(*) cnt
FROM your_table
GROUP BY BID
HAVING COUNT(*) > 1
) q
这里的内部查询将您的出价组合在一起,计算每个组中的数量,然后仅选择具有多于1个值的组。
外部查询只计算该查询的结果。
你可以看到它是如何工作在这里:http://sqlfiddle.com/#!9/0c9e6/3
答
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
答
你只有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
您已用COUNT()列出了一个关键字。你应该寻找的其他人是'HAVING'和'GROUP BY'。 – Sirko 2015-04-02 06:45:21
您在这里使用MySQL或SQL Server吗?我认为其中一个答案是产品特定的...这是一个好主意,不标记未使用的产品! – jarlh 2015-04-02 06:58:57
我刚刚针对mysql和sql server进行了测试,对两者都适用,因此在那里很安全 – 2015-04-02 07:06:01