Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL:最新记录的总和_Mysql_Sql - Fatal编程技术网

MYSQL:最新记录的总和

MYSQL:最新记录的总和,mysql,sql,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,

我需要有关查询语句的帮助以添加所选记录

表“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的分数进行求和,条件是,如果相同的分数超过2年,则只考虑最近一年的分数

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

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

提前谢谢。

也可以这样尝试:

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

要获取所有名称及其要点(按照您的逻辑),您可以尝试:

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 Fiddle演示:

这可能对您有用:

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

如果液位仅上升,@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;

如果您以不同的方式设计表格,您可以更轻松地实现这一点。级别仅为1或2。但2是否可以更改为1?非常感谢。我用我的数据测试了您的代码,效果良好。谢谢。我认为有一些打字错误。tblA变为tablA,因此无法执行它。当我将其更改为tablA并执行时,我得到了错误的数据。不过,请欣赏ef很抱歉,忘记了分组方式;请参阅我的编辑。--看着它,我似乎误解了“级别”必须相等。因此,现在我已经更正了错误,我的建议与lpg的基本相同:o)谢谢。没有得到想要的结果。