2013-05-21 49 views
2

我有兩個表。球隊和球員。我想要做的是創建一個查詢,告訴我關於最大團隊薪水的一些統計數據。具體而言,我要計算有多少玩家少於5K。有多少人在5K和10K之間......以5K爲增量給最高玩家。從MySQL獲取分層數據

這裏是SQL:

CREATE TABLE `formsfiles`.`Teams` (
    `ID` INT NOT NULL AUTO_INCREMENT , 
    `Name` VARCHAR(45) NULL , 
    PRIMARY KEY (`ID`)); 


INSERT INTO `Teams` (`Name`) VALUES ('Sharks'); 
INSERT INTO `Teams` (`Name`) VALUES ('Jets'); 
INSERT INTO `Teams` (`Name`) VALUES ('Fish'); 
INSERT INTO `Teams` (`Name`) VALUES ('Dodgers'); 


CREATE TABLE `Players` (
    `ID` INT NOT NULL AUTO_INCREMENT , 
    `Name` VARCHAR(45) NULL , 
    `Team_ID` INT NULL , 
    `Salary` INT NUll , 
    PRIMARY KEY (`ID`)); 

INSERT INTO `Players` (`Name`, `Team_ID`, salary) VALUES ('Jim', '1', '4800'); 
INSERT INTO `Players` (`Name`, `Team_ID`, salary) VALUES ('Tom', '1', '12000'); 
INSERT INTO `Players` (`Name`, `Team_ID`, salary) VALUES ('Harry', '2', '1230'); 
INSERT INTO `Players` (`Name`, `Team_ID`, salary) VALUES ('Dave', '2', '19870'); 
INSERT INTO `Players` (`Name`, `Team_ID`, salary) VALUES ('Tim', '3', '1540'); 
INSERT INTO `Players` (`Name`, `Team_ID`, salary) VALUES ('Trey', '4','7340'); 
INSERT INTO `Players` (`Name`, `Team_ID`, salary) VALUES ('Jay', '4', '4800'); 
INSERT INTO `Players` (`Name`, `Team_ID`, salary) VALUES ('Steve', '4','6610'); 
INSERT INTO `Players` (`Name`, `Team_ID`, salary) VALUES ('Chris', '4','17754'); 

鑑於這樣的數據:道奇隊是最大的球隊(ID = 4) 我們想的輸出:

0-5000  1 
5000-10000 2 
10000-15000 0 
15000-20000 1 

如果這個代碼看起來我很熟悉它是因爲它是我在這裏發佈的一個先前問題的一個進化問題。請不要把我打倒!

+0

你可以選擇它們之間的簡單條件,並將它們聯合起來 – rcpayan

回答

1

計數該代碼會做什麼幾乎你行要

SELECT 5000 * FLOOR(Salary/5000), count(*) 
FROM Players 
WHERE Team_ID = 4 
GROUP BY FLOOR(Salary/5000) 

它返回的範圍內的低邊界和條目數

0  1 
5000  2 
15000 1 

請注意,它不會返回空範圍。

3

這是我的嘗試。它採用加入到滿足條件:

select sr.range, 
     SUM(case when p.salary >= sr.low and p.salary < sr.high then 1 else 0 end)   
from Players p join 
    (select t.id 
     from Players p join 
      Teams t 
      on p.team_id = t.id 
     group by t.team_id 
     order by SUM(p.salary) desc 
     limit 1 
    ) team 
    on p.team_id = team.id cross join 
    (select '0-5000' as range, 0 as low, 5000 as high union all 
     select '5000-10000', 5000, 10000 union all 
     select '10000-15000', 10000, 15000 union all 
     select '15000-20000', 15000, 20000 
    ) sr 
group by sr.range 
order by min(sr.low) 

注意使用的範圍內單獨查詢,以確保你得到的0