2014-09-03 107 views
3

我需要查詢語句的幫助來添加選定的記錄。MYSQL:最新記錄總和

的表記錄示例「TBLA」

Name, Year, Level, Points, Item 
John, 2012, 1,  2,  bag 
John, 2012, 1,  1,  book 
John, 2013, 1,  1,  pen 
John, 2013, 1,  1,  pencil 
John, 2014, 2,  3,  hat 
John, 2014, 2,  1,  ruler 
Kent, 2014, 2,  2,  bag 
Mic, 2014, 2,  2,  bag 
Dan, 2014, 2,  2,  bag 
Tim, 2014, 2,  2,  bag 

是否有可能做一個1個語句查詢與條件求和點約翰,如果水平超過2相同年,那麼只考慮最近一年的積分。

例如:在上面的例子中,只有下面的記錄應該添加點。 (2012年的記錄應事先被忽略,因爲那裏是具有1級。因此約翰應該有6點以後的一年(2013年)

John, 2013, 1, 1, pen 
John, 2013, 1, 1, pencil 
John, 2014, 2, 3, hat 
John, 2014, 2, 1, ruler 

感謝

+2

,如果你設計你的表diferently你可以做到這一點更容易。 – Juanpe 2014-09-03 08:27:45

+0

可以降級嗎? – Bulat 2014-09-03 08:47:13

+0

級別僅爲1或2。 – 2014-09-03 08:52:49

回答

5

要獲得所有的名字和他們的積分(以下你的邏輯),你可以嘗試:

SELECT tblA.Name, SUM(points) AS totalPoints FROM tblA 
JOIN (
SELECT MAX(year) year, Name, Level 
FROM tblA 
GROUP BY Name, Level) tblA2 
ON tblA.Name = tblA2.Name 
AND tblA.year = tblA2.year 
AND tblA.Level = tblA2.Level 
GROUP BY Name 

如果你只對 '約翰' 點興趣的話,那麼:

SELECT tblA.Name, SUM(points) AS totalPoints FROM tblA 
JOIN (
SELECT MAX(year) year, Name, Level 
FROM tblA 
WHERE Name = 'John' 
GROUP BY Name, Level) tblA2 
ON tblA.Name = tblA2.Name 
AND tblA.year = tblA2.year 
AND tblA.Level = tblA2.Level 
GROUP BY Name 

SQL小提琴演示:http://sqlfiddle.com/#!2/75f478/9

+0

非常感謝。我用我的數據測試了你的代碼,它工作。 – 2014-09-03 08:56:31

1

也許還嘗試像這樣:

select tblA.name, tblA.year, sum(tblA.points) 
from tblA 
inner join (
    select name, level, max(year) as yr 
    from tblA 
    group by name, level) as yearTbl 
on tblA.name=yearTbl.name and tblA.year=yearTbl.yr and tblA.level=yearTbl.level 
group by tblA.name, tblA.year 
+0

謝謝。認爲有一些錯字錯誤。 tblA變成tablA,所以不能執行它。當我將其更改爲tablA並執行時,我收到了錯誤的數據。儘管如此,欣賞努力 – 2014-09-03 09:03:31

+0

對不起,忘了組;看我的編輯。 - 看着它,我似乎誤解了「水平」必須是平等的。 – JimmyB 2014-09-03 09:58:00

+0

所以,現在我已經糾正了錯誤,我的提議基本上與lpg的相同:o) – JimmyB 2014-09-03 10:03:14

0

可能是這樣可以爲你工作:

select name ,sum(points) from tblA group by name , year ,level having count(*) 
= 2 ; 
+0

謝謝。沒有得到理想的結果。 – 2014-09-03 09:06:20

0

@lpg的答案如果水平只上升,那麼它就很棒。但是,如果級別降低的解決方案可能會有所不同。這裏是一個通用的解決方案:

SELECT Levels.Name, SUM(points) AS totalPoints FROM Levels 
INNER JOIN (
SELECT Name, Year FROM (
    SELECT Name, MAX(Year) Year FROM 
    (
    SELECT 
    l.*, 
    @prev_level as previous_level, 
    CASE WHEN @prev_level IS NULL THEN FALSE 
     ELSE @prev_level != l.level 
    END AS level_change, 
    @prev_level := l.level as set_new_level 
    FROM Levels l, (SELECT @prev_level:= NULL) c) t 
    GROUP BY Name, level_change, level) tt 
GROUP BY Name, Year) ttt 
    ON Levels.Name = ttt.Name AND Levels.year = ttt.year 
GROUP BY Levels.Name; 

http://sqlfiddle.com/#!2/57643/21