2014-09-03 100 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