2016-01-06 33 views
0

我有一個列中有10個里程碑的列表milestone。列milestone_achieved具有值OKNULLname列只有名稱,每當有人進入時,所有里程碑都將輸入到NULL的數據庫中。使用列的最大值,如果空使用分鐘

下面是一個典型的表如下所示:

+------+-----------+--------------------+ 
| name | milestone | milestone_achieved | 
+------+-----------+--------------------+ 
| John |   1 | OK     | 
| John |   2 | OK     | 
| John |   3 | NULL    | 
| John |   4 | NULL    | 
| John |   5 | NULL    | 
| John |   6 | NULL    | 
| Mary |   1 | OK     | 
| Mary |   2 | OK     | 
| Mary |   3 | OK     | 
| Mary |   4 | OK     | 
| Mary |   5 | OK     | 
| Mary |   6 | OK     | 
| Tim |   1 | NULL    | 
| Tim |   2 | NULL    | 
| Tim |   3 | NULL    | 
| Tim |   4 | NULL    | 
| Tim |   5 | NULL    | 
| Tim |   6 | NULL    | 
+------+-----------+--------------------+ 

現在我想的SQL查詢返回:

+------+-----------+--------------------+ 
| name | milestone | milestone_achieved | 
+------+-----------+--------------------+ 
| John |   2 | OK     | 
| Mary |   6 | OK     | 
| Tim |   1 | NULL    | 
+------+-----------+--------------------+ 

我的查詢現在看起來是這樣的:

SELECT name, MAX(milestone) FROM table HAVING milestone_achieved = 'OK' GROUP BY name 
UNION ALL 
SELECT name, MIN(milestone) FROM table HAVING milestone_achieved IS NULL AND MIN(milestone) = 1 GROUP BY name 

這適用於90%的情況,當例如發生問題時里程碑1和2已經完成,但是里程碑1因爲不符合特定標準或其他因素而未完成(想象一下組裝線,其中汽車組裝在一起並且螺釘=milestone 1不夠緊密,但油漆=milestone 2已經存在或者你可以想象的其他任何東西,我都有可怕的想象力)。

我現在正在尋找一種方法來正確顯示這些10%的情況。

+0

您的異常情況的預期輸出是多少? –

+1

我不確定你的查詢是否有效。 [HAVING](https://msdn.microsoft.com/en-GB/library/ms180199.aspx)子句可以過濾[聚合函數]的結果(https://msdn.microsoft.com/zh-CN/zh-cn/庫/ ms173454.aspx)(SUM,MIN,MAX等)。它需要與GROUP BY子句結合使用。 [WHERE](https://msdn.microsoft.com/en-gb/library/ms188047.aspx)允許您在行級進行過濾。除了挑選外,你的方法是正確的。 Gordon Linoff在下面的答案糾正了這些錯誤。 –

+0

實際異常情況的輸出將是(如果我們假設Tim已經取消了他的'里程碑1'成就:'John,2,OK','Mary,6,OK','Tim,2,OK','Tim ,1,NULL'。 我實際上希望'Tim,1,NULL'從結果中消失,解決方案在@Gordon Linoff的答案中。 – Spurious

回答

3

的一種方法是:

SELECT name, MAX(milestone) 
FROM table 
WHERE milestone_achieved = 'OK' 
GROUP BY name 
UNION ALL 
SELECT name, MIN(milestone) 
FROM table 
GROUP BY name 
HAVING MIN(milestone_achieved) IS NULL; 

這遵循的邏輯的結構。您可以使用一個SELECT

SELECT name, 
     COALESCE(MAX(CASE WHEN milestone_achieved = 'OK' THEN milestone END), 
       MIN(milestone) 
       ) 
FROM table 
GROUP BY name 
+0

謝謝!實際上解決了這個問題。 – Spurious

相關問題