2017-07-22 30 views
0

查詢#1:如何在SQL Server中使用self和join?

SELECT 
    voter, COUNT(*) AS voter 
FROM 
    TxVotes 
WHERE 
    timestamp BETWEEN '2017-07-21 00:00:00.000' and '2017-07-22 00:00:00.000' 
GROUP BY 
    voter 
ORDER BY 
    COUNT(*) DESC 

工作..........

查詢#2:

SELECT 
    author 
FROM 
    Comments 
WHERE 
    AND language LIKE '%"ko"%' 

工作.......... ....

我需要查詢#3:

SELECT 
    TxVotes.voter, TxVotes.count(*) AS TxVotes.voter 
FROM 
    TxVotes, Comments 
WHERE 
    TxVotes.voter = Comments.author 
    AND timestamp TxVotes.BETWEEN '2017-07-21 00:00:00.000' AND '2017-07-22 00:00:00.000' 
    AND Comments language LIKE '%"ko"%' 
GROUP BY 
    TxVotes.voter 
ORDER BY 
    TxVotes.count(*) DESC 

但是這不起作用...

我們如何在SQL Server中使用自連接和count?

+0

幫助我們幫助您 - 您可以分享一些樣本數據,您獲得的結果以及您試圖獲得的結果嗎? – Mureinik

+0

你能附加錯誤信息嗎? –

+0

不應該是TxVotes.timestamp和Comments.language? –

回答

2

正確的語法是:

SELECT v.voter, COUNT(v.id) as numvoters 
FROM TxVotes v JOIN 
    Comments c 
    ON t.voter = c.author 
WHERE v.timestamp >= '2017-07-21' AND 
     v.timestamp < '2017-07-22' AND 
     c.language LIKE '%"ko"%' 
GROUP BY v.voter 
ORDER BY COUNT(DISTINCT v.id); 

我注意到肯定,如果要統計選民或投票和評論的某種組合。我在猜測選民,因此COUNT(DISTINCT)

注:FROM子句中

  • 決不使用逗號。 始終使用使用正確的,明確的JOIN語法。
  • 我懷疑你想包括2017年2月22日剛剛午夜的記錄。因此,>=<優於BETWEEN
  • 表別名使查詢更容易編寫和讀取。在你的情況下,他們也應該減輕你的困惑。您使用表名限定列名。你不符合職能。
  • COUNT(DISTINCT v.voter)應計算得票數。這處理了對於單個選民有多個評論的情況。注意:通常,我會使用INEXISTS來處理這個問題,但我遵循了原來的邏輯。
+0

如果你正在計算DISTINCT v.voter和v.voter分組,count不會總是1嗎?也許計數不同的TxVotes.PK_column? – Skippy