För alla som spelar golf så vet ni att det finns något som heter Greenträff, dvs rätt antal slag till green. Detta kan man räkna ut på följande sätt. Jag skulle i första hand föreslå en designändring av databasen enligt nedan :Utränkning Stored Procedure...
om (slag - puttar) <= (par - 2) så har man en greenträff.
Jag har data lagrat i en SQL db och skulle vilja slippa uträkningen nedan och hämta statistiken via en lagrad procedur.
I Db har jag bla. fälten
slag_hål_1 till slag_hål_18
puttar_hål_1 till puttar_hål_18
par_hål_1 till par_hål_18
data_id = key
------
detta är mitt gamla sätt som jag skrivit direkt på asp sidan. (info. gir=greenträff)
------ ------
gir = 0
for i = 0 to 17
if (array_slag(i) - array_puttar(i)) <= (array_par(i) - 2)
then gir = gir + 1
else
gir = gir
end if
next
------ ------
nu vill jag göra samma sak fast med en stored procedure...
Tack på förhand!!Sv: Utränkning Stored Procedure...
Först en tabell som innehåller information om vilken runda det handlar om (vilken bana, datum, med/motspelare, väderlek, o dyl) :
<info>
Tabell : Runda
-----------------------------------------------
id int 4 Not null (Identity, Primary key)
Datum datetime 8 Not null
Bana varchar 50 Not null
</info>
Sedan en tabell för varje hål under rundan. Det kommer alltså att bli 18 poster per runda i denna tabell.
<info>
Tabell : Hål
----------------------------------------------------
id int 4 Not null (Identity, Primary key)
RundaID int 4 Not null
Slag int 4 Not null
Putt int 4 Not null
Par int 4 Not null
HålNr int 4 Not null
</info>
Här kommer lite exempel data för tabellen Hål (5 första hålen på runda med id=1)
<info>
id RundaID Slag Putt Par HålNr
--------------------------------------------------------------------
1 1 5 2 3 1
2 1 4 1 3 2
3 1 6 3 5 3
4 1 3 1 3 4
5 1 3 1 4 5
</info>
Slutligen godbiten som räknar ut greenträff för en runda (rundan med id=1):
<info>
select sum(CASE WHEN (Slag-Putt-Par+2)>0 THEN 1 ELSE 0 END) FROM Hål WHERE RundaID=1
</info>
Egentligen skulle det även behövas en tabell "ovanför" Runda som heter Tävling eftersom en tävling kan bestå av flera rundor. Dessutom bör man kanske lagra information om banorna (och dess hål/par/längd) och information om slagen i en specifik runda på den banan separat för att normalisera det korrekt. Men det blir för mycket att skriva här...Min poäng är helt enkelt att du nog bör se över databasdesignen om det inte är för sent...
[EDIT : Ber om ursäkt för att formateringen inte blev så bra...hoppas du kan reda ut det i alla fall]
[EDIT 2 : ] Om det är för sent att ändra databasdesignen så är en lösning att skriva en lång SQL-sats enligt nedan :
<info>
select (CASE WHEN (Slag_Hål1-Putt_Hål1-Par_Hål1+2)>0 THEN 1 ELSE 0 END) +
(CASE WHEN (Slag_Hål2-Putt_Hål2-Par_Hål2+2)>0 THEN 1 ELSE 0 END) +
(CASE WHEN (Slag_Hål3-Putt_Hål3-Par_Hål3+2)>0 THEN 1 ELSE 0 END) +
...
...
(CASE WHEN (Slag_Hål18-Putt_Hål18-Par_Hål18+2)>0 THEN 1 ELSE 0 END) AS Antal_GreenTraff
FROM ....
</info>
Inte speciellt snyggt men det borde fungera...