我需要查询语句的帮助才能添加所选记录。
表格中的记录示例“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
提前致谢。
答案 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;