2015-04-02 212 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