2

私は2つのテーブルを持っています。チームとプレーヤー。私がやりたいことは、最大のチームの給与に関する統計データを教えてくれるクエリを作成することです。具体的には、5K 未満のプレーヤーの数を数えたいと考えています。5K から 10K の間で何人作るか ....最大プレーヤーまで 5K 単位で。

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

このコードがおなじみのように見える場合、それは、私がここに投稿した以前の問題が進化したものであるためです。どうか私を殴らないでください!

4

2 に答える 2

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 の行を確実に取得するために、範囲に対して別のクエリを使用していることに注意してください。

于 2013-05-21T20:39:19.230 に答える
2

このコードは、ほとんどあなたが望むことを行います

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

範囲の下限とエントリ数を返します

0        1
5000     2
15000    1

空の範囲は返されないことに注意してください。

于 2013-05-21T20:41:08.327 に答える