使用内连接计算两个表的年份范围和总和

问题描述 投票:0回答:1

我有两个表 - 跨越个人职业生涯的每条记录的击球年份字段,以及个人的首次亮相年份和最后一年。所有这 3 个都是smallint。我使用以下查询仅获取 DebutYear+value 到 DebutYear+2nd-value 之间指定职业范围内的击球年份。 在这种情况下,它应该只对这些年份的 AB 求和,但它是对击球表中的所有年份求和。 我对 JOINS 有点缺乏经验。任何帮助将不胜感激!

SELECT CONCAT(FirstName, ' ', LastName) AS Name, B.PersonID, SUM(AB) AS AB
  FROM Batting B
  INNER JOIN Person P ON P.PersonID = B.PersonID
    AND (B.Year >= (P.DebutYear+1) AND B.Year <= (P.DebutYear+2))
  WHERE B.PersonID = P.PersonID 
  GROUP BY B.PersonID
  HAVING (AB >= 10000)
  ORDER BY AB Desc, LastName, FirstName
  LIMIT 1000
select inner-join
1个回答
0
投票

过滤器应应用于

WHERE
子句,而不是
JOIN

SELECT CONCAT(P.FirstName, ' ', P.LastName) AS Name, B.PersonID, SUM(B.AB) AS AB
  FROM Batting B
  INNER JOIN Person P ON P.PersonID = B.PersonID
  WHERE B.Year BETWEEN (P.DebutYear + 1) AND (P.DebutYear + 2)
  GROUP BY B.PersonID, P.FirstName, P.LastName
  HAVING SUM(B.AB) >= 1000
  ORDER BY AB DESC, P.LastName, P.FirstName
  LIMIT 1000;

这是一个工作示例:

-- Reset
DROP TABLE IF EXISTS Batting;
DROP TABLE IF EXISTS Person;

-- Schemas
CREATE TABLE Person (
    PersonID INT PRIMARY KEY,
    FirstName VARCHAR(100),
    LastName VARCHAR(100),
    DebutYear SMALLINT,
    FinalYear SMALLINT
);

CREATE TABLE Batting (
    BattingID INT PRIMARY KEY,
    PersonID INT,
    Year SMALLINT,
    AB INT,  -- At Bats
    FOREIGN KEY (PersonID) REFERENCES Person(PersonID)
);

-- Sample data
INSERT INTO Person (PersonID, FirstName, LastName, DebutYear, FinalYear)
VALUES 
(1 , 'John'  , 'Doe'   , 2000 , 2010),
(2 , 'Jimmy' , 'Smith' , 1995 , 2005),
(3 , 'James' , 'Brown' , 1972 , 1982);

INSERT INTO Batting (BattingID, PersonID, Year, AB)
VALUES 
(1, 1, 2001, 500), -- John Doe    (2001, DebutYear + 1, total so far: 500)
(2, 1, 2002, 600), -- John Doe    (2002, DebutYear + 2, total so far: 1100)
(3, 1, 2003, 700), -- John Doe    (2003, outside of the range, not included)
(4, 2, 1996, 400), -- Jimmy Smith (1996, DebutYear + 1, total so far: 400)
(5, 2, 1997, 550), -- Jimmy Smith (1997, DebutYear + 2, total so far: 950, below threshold)
(6, 3, 1973, 600), -- James Brown (1973, DebutYear + 1, total so far: 600)
(7, 3, 1974, 700); -- James Brown (1974, DebutYear + 2, total so far: 1300)

-- Query for players with an AB >= 1000 between DebutYear + 1 and DebutYear + 2
SELECT CONCAT(P.FirstName, ' ', P.LastName) AS Name, B.PersonID, SUM(B.AB) AS AB
  FROM Batting B
  INNER JOIN Person P ON P.PersonID = B.PersonID
  WHERE B.Year BETWEEN (P.DebutYear + 1) AND (P.DebutYear + 2)
  GROUP BY B.PersonID, P.FirstName, P.LastName
  HAVING SUM(B.AB) >= 1000
  ORDER BY AB DESC, P.LastName, P.FirstName
  LIMIT 1000;

结果应该只包括 James 和 John,但不包括 Jimmy。

姓名 人员ID AB
詹姆斯·布朗 3 1300
约翰·多伊 1 1100
© www.soinside.com 2019 - 2024. All rights reserved.