Merhaba arkadaşlar,
Pratik olsun diye sizinle bir SQL sorgusu yazacağız. Yazacağımız sorgu özellikle raporlama, ve istatiksel bilgiler oluşturmak için ufkunuzu biraz açar diye umuyorum. Bildiğiniz gibi günümüzde büyük veri( big data ) denilen bir kavram ortaya çıktı. Bunun için raporlama, bu verilerin içinden anlamlı veriler cıkarmak, oluşturmak önemli bir hal aldı. Yapılan aratırmalara göre dünya üzerinde varolan tüm verilerin %90’ı son iki yılda oluşturuldu. Şu linkten inceleyebilirsiniz. Şimdi gelelim yazacağımız SQL sorgusuna. Bunun için şu şekilde tablolarımız olsun.
- Team
- id
- name
- Player
- id
- team_id
- player_number
- player_name
- Match
- id
- home_id
- guest_id
- match_date
- Goal
- id
- match_id
- player_id
- minute
2014 dünya kupasından ötürü hazırlanmış güzel bir ilişkisel veritabanı. Tablo ve tabloda yer alan alan(field)lar yeterince açık olduğu için daha fazla detaya girmek istemiyorum.
Burada bizim oluşturmak istediğimiz sorgu ise şu olsun :
İlk yarıda attığı gol sayısı ikinci yarıda attığı gol sayısından fazla olan takımların listelenmesini yapalım. İlk bakışta zor gelebilir ama üzerine biraz düşünüldüğünde bu sorguyu SQL ile güzel bir şekilde oluşturabiliriz.
Sorgumuz :
select * from teams t where ( select count( distinct g.id) from goals g inner join matches m on m.id = g.match_id inner join players p on p.team_id = t.id where ( m.home_id = t.id or m.guest_id = t.id ) and g.player_id = p.id and g.minute <= 45 ) > ( select count( distinct g.id) from goals g inner join matches m on m.id = g.match_id inner join players p on p.team_id = t.id where ( m.home_id = t.id or m.guest_id = t.id ) and g.player_id = p.id and g.minute > 45 )
Evet sorgumuz bu şekilde. Ayrıca burada farklı dakikalar içinde istatiksel bilgiler alınabilir. Bu sayede futbol takımlarına ilişkin istatiksel bilgiler oluşturulabilir. Bu şekilde ki bir veritabanı yapısını Ruby on Rails de oluşturdum ve rails’e ait Object-Relational Mapping (ORM) ile bu sorguyu oluşturmaya çalıştım. Bu çalışmamın kaynak kodlarına buradan ulaşabilirsiniz.
Teşekkürler..
Kolay gelsin..
İlk yarı için kullandığın “g.minute = 45” ikisinde de 45e eşit olduğu için 45. dk da atılan goller iki kere sayılmış olmaz mı?
Evet haklısın ikinci yarıda kullanılan >= de eşittiri kaldırmak gerekiyor.