2013-04-25 75 views
0

我有一个数据集见下图:更新的DataSet加caclulated领域

SELECT jockey.jockey_skey 
, raceresults.place 
FROM jockey 
     INNER JOIN runnersandriders 
       ON jockey.jockey_skey = runnersandriders.jockey_skey 
     INNER JOIN horse 
       ON runnersandriders.horse_skey = horse.horse_skey 
     INNER JOIN raceresults 
       ON horse.horse_skey = raceresults.horse_skey 
GROUP BY jockey.jockey_skey, 
      raceresults.place 
ORDER BY jockey.jockey_skey 

这为我提供了:

Jockey_Skey Place 
1    01 
1    04 
2    03 
2    04 
3    02 
3    02 

我想要做的就是算一个赛马有多少场比赛跑和他们来的清单。

因此,骑师1,赛程2次,第一次和第四次如此如此,但对于我的生活,我不记得如何去做。

我希望你能帮上忙。

感谢

W¯¯

回答

1

你可以使用这样的事情让每个骑师的结果一行:

SELECT jockey.jockey_skey, 
     TotalRaces = COUNT(*), 
     [1sts] = COUNT(CASE WHEN raceresults.place = '01' THEN 1 END), 
     [2nds] = COUNT(CASE WHEN raceresults.place = '02' THEN 1 END), 
     [3rds] = COUNT(CASE WHEN raceresults.place = '03' THEN 1 END), 
     [4ths] = COUNT(CASE WHEN raceresults.place = '04' THEN 1 END), 
     [5ths] = COUNT(CASE WHEN raceresults.place = '05' THEN 1 END), 
     [6ths] = COUNT(CASE WHEN raceresults.place = '06' THEN 1 END), 
     [7ths] = COUNT(CASE WHEN raceresults.place = '07' THEN 1 END), 
     [8ths] = COUNT(CASE WHEN raceresults.place = '08' THEN 1 END), 
     -- etc 
     [NonRunner] = COUNT(CASE WHEN raceresults.place = 'NR' THEN 1 END), 
     [Fell] = COUNT(CASE WHEN raceresults.place = 'F' THEN 1 END), 
     [PulledUp] = COUNT(CASE WHEN raceresults.place = 'PU' THEN 1 END), 
     [Unseated] = COUNT(CASE WHEN raceresults.place = 'U' THEN 1 END), 
     [Refused] = COUNT(CASE WHEN raceresults.place = 'R' THEN 1 END), 
     [BroughtDown] = COUNT(CASE WHEN raceresults.place = 'B' THEN 1 END) 
FROM jockey 
     INNER JOIN runnersandriders 
      ON jockey.jockey_skey = runnersandriders.jockey_skey 
     INNER JOIN horse 
      ON runnersandriders.horse_skey = horse.horse_skey 
     INNER JOIN raceresults 
      ON horse.horse_skey = raceresults.horse_skey 
GROUP BY jockey.jockey_skey 
ORDER BY jockey.jockey_skey 

Simplified Example on SQL Fiddle

另外,您可以使用WITH ROLLUP获得总计额外的一行:

SELECT jockey.jockey_skey, 
     raceresults.place, 
     [CountOfResult] = COUNT(*) 
FROM jockey 
     INNER JOIN runnersandriders 
      ON jockey.jockey_skey = runnersandriders.jockey_skey 
     INNER JOIN horse 
      ON runnersandriders.horse_skey = horse.horse_skey 
     INNER JOIN raceresults 
      ON horse.horse_skey = raceresults.horse_skey 
GROUP BY jockey.jockey_skey, raceresults.place 
WITH ROLLUP 
ORDER BY jockey.jockey_skey, raceresults.place; 

NULL值代表共计

Simplified Example on SQL Fiddle

+0

喜加雷斯选项1将是完美的,但我的地方字段是VARCHAR(50),这是因为我有事情喜欢NR,PU等这样第一个选项给我错误信息 Msg 245,Level 16,State 1,Line 1 将varchar值'NR'转换为数据类型int时转换失败。 – wafw1971 2013-04-25 10:43:45

+0

你只需要把数字放在引号内'01'或'1'。我编辑了包含更多可能结果的答案 – GarethD 2013-04-25 10:49:22

+0

杰出的Gareth非常感谢你。 – wafw1971 2013-04-25 10:51:21