MYSQL:最新记录的总和

时间:2014-09-03 08:18:50

标签: mysql sql

我需要查询语句的帮助才能添加所选记录。

表格中的记录示例“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个语句查询以对John的积分求和,条件是如果Level超过2年相同,则只考虑最近一年的积分。

例如:在上述情况下,只有以下记录应该添加点数。 (2012年的记录应该被忽略,因为有一年级(2013年)有1级。因此约翰应该有6分。

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

提前致谢。

4 个答案:

答案 0 :(得分: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

如果您只对John'点,然后:

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

答案 1 :(得分: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

答案 2 :(得分:0)

可能这对您有用:

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

答案 3 :(得分:0)

如果等级上升,@ ltg的答案很棒。但是,如果水平下降解决方案可能会有所不同。这是一个通用的解决方案:

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

相关问题