2014-10-28 28 views
1

最簡單的解釋通過一個例子。具有唯一ID的Mysql SUM CASE只有

父親有孩子誰贏得比賽。

有多少個父親獲得了一場比賽,總共有多少個種族獲得了一個父親的後代。 (贏家和勝利)

我可以很容易地計算出勝利的總數,但有時候孩子會贏得多於一場比賽,所以要想出勝者,我只需要在孩子贏得勝利的情況下取得勝利,而不是所有勝利時間。

在從查詢我不能使用distinct以下提取物,所以這是行不通

SUM(CASE WHEN r.finish = '1' AND DISTINCT h.runnersid THEN 1 ELSE 0 END) AS winners, 

這也將無法正常工作

SUM(SELECT DISTINCT r.runnersid FROM runs r WHERE r.finish='1') AS winners 

這工作時,我需要找到總勝數。

SUM(CASE WHEN r.finish = '1' THEN 1 ELSE 0 END) AS wins, 

這裏是一個sqlfiddle http://sqlfiddle.com/#!2/e9a81/1

+1

如果你喜歡,可以考慮下列行爲這個簡單的兩步過程:1.如果您還沒有這樣做,提供適當的DDL(和/或sqlfiddle),這樣我們就可以更容易複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相符的所需結果集。 – Strawberry 2014-10-28 13:33:20

+0

@strawberry感謝您提供的建議我已添加小提琴。 – stemie 2014-10-29 07:07:16

+0

這個問題其實挺好玩的:) – Adam 2016-11-23 22:14:08

回答

2

讓我們一步一步來。

你有兩條你正在尋找的信息:誰贏了比賽,他們有多少場比賽。

以第一位的,你可以選擇不同的runnersid他們有第一個地方完成:

SELECT DISTINCT runnersid 
FROM runs 
WHERE finish = 1; 

對於第二個,您可以選擇每runnersid他們有第一個地方完成,算上返回的行數,以及通過runnersid分組以獲得每個的總勝數:

SELECT runnersid, COUNT(*) AS numWins 
FROM runs 
WHERE finish = 1 
GROUP BY runnersid; 

第二個實際上擁有您想要的一切。你不需要對第一個查詢做任何事情,但是我用它來幫助證明我在完成這樣的任務時所採取的思考過程。

這裏是SQL Fiddle的例子。

編輯

正如你所看到的,你並不真的需要這裏的總和。因爲完成代表比賽中的一個位置,所以您不希望累計該值,但是您想要計算勝利次數。

EDIT2

基於OP的要求額外的編輯。以上內容與OP需求不符,但我將其留作未來讀者的參考。正如我現在所瞭解的,OP真正需要的是每個父親都參加比賽的孩子數量。我會再一次一步一步解釋我的思維過程。

首先,我寫了一個簡單的查詢,拉取所有獲獎的父子配對。我能夠使用GROUP BY來獲得不同的獲勝對:

SELECT father, name 
FROM runs 
WHERE finish = 1 
GROUP BY father, name; 

一旦我這樣做了,我用它是一個子查詢和COUNT(*)函數來獲得獲獎人數爲每個父親(這意味着我必須由父親組合):

SELECT father, COUNT(*) AS numWinningChildren 
FROM(SELECT father, name 
     FROM runs 
     WHERE finish = 1 
     GROUP BY father, name) t 
GROUP BY father; 

如果你只是需要與獲獎的孩子的父親,你就完成了。如果你想看到所有的父親,我會寫一個查詢來選擇所有的父親,加入我們的結果集,並將numWinningChildren爲空的值替換爲0.

我會把那部分留給你挑戰自己一點。此外,由於SQL小提琴暫時關閉,我無法測試我在想什麼,但是我能夠成功地測試上述內容。

+0

不完全回答我的問題,請參閱我的sqlfiddle。 – stemie 2014-10-29 07:26:19

+0

@stemie今天下午我下班的時候我會調查一下。我爲我的誤會道歉。如果您在此之前解決此問題,請告訴我。 – AdamMc331 2014-10-29 12:58:27

+0

@stemie請參閱我的編輯。 – AdamMc331 2014-10-29 13:22:06

0

我不知道如果這是你在找什麼

Select user_id, sum(case when finish='1' then 1 else 0 end) as total From table Group by user_id

+0

我可以工作那一個out'SUM(如果r.finish ='1'則1例如0結束)AS勝利'我只有在孩子沒有贏得多少次勝利時才需要找到贏家。 – stemie 2014-10-28 13:56:32

0

我想你想要父親的名字以及他兒子的勝利數。

select father, count(distinct(id)) wins 
from runs where father = 'jack' and finish = 1 
group by father 

sqlfiddle