【问题标题】:MYSQL: sum of latest recordMYSQL:最新记录的总和
【发布时间】:2014-09-03 08:18:49
【问题描述】:

我需要查询语句的帮助来添加选定的记录。

“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

提前致谢。

【问题讨论】:

  • 如果您设计不同的表格,您可以更轻松地实现这一点。
  • 级别仅为 1 或 2。
  • 2 可以改成 1 吗?

标签: mysql sql


【解决方案1】:

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

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 Fiddle 演示:http://sqlfiddle.com/#!2/75f478/9

【讨论】:

  • 非常感谢。我用我的数据测试了你的代码,它可以工作。
【解决方案2】:

也许也可以这样尝试:

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

【讨论】:

  • 谢谢。认为有一些拼写错误。 tblA 变成了 tablA 所以不能执行它。当我将其更改为 tablA 并执行时,我得到了错误的数据。不过感谢您的努力
  • 对不起,忘记分组了;看我的编辑。 -- 看了一下,好像误会了“Level”一定是相等的。
  • 所以,既然我已经纠正了错误,我的建议基本上和lpg的一样:o)
【解决方案3】:

也许这对你有用:

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

【讨论】:

  • 谢谢。没有得到想要的结果。
【解决方案4】:

如果级别只会上升,@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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2022-12-08
    • 1970-01-01
    • 2017-11-24
    • 2016-08-23
    • 1970-01-01
    相关资源
    最近更新 更多