Jag försöker att ta fram medelplaceringen på låter i tre avseénde, placering Sverige, placering Europa och placering Världen.
Nu är det så att om det inte finns något inskrivit i databasen får bestämd låt, så har jag satt som defoult 0. Detta uppfatar ju databasen som bättre än 1. Hur löser jag det?
Hur talar jag om att jag bara vill ha två decimaler?
Så här ser SQL:en ut.
SQL = "SELECT t_SongTitlar.songtitel, Avg(t_Datum.PlaceringSv) AS MedelförPlaceringSv, Avg(t_Datum.PlaceringEu) AS MedelförPlaceringEu, Avg(t_Datum.PlaceringVärlden) AS MedelförPlaceringVärlden " & _
" FROM t_SongTitlar INNER JOIN t_Datum ON t_SongTitlar.titel_Id = t_Datum.Sång_ID " & _
" GROUP BY t_SongTitlar.songtitel " & _
" HAVING (((t_SongTitlar.songtitel)='" & List1.Text & "'))"
Set mittRS2 = minDB.OpenRecordset(SQL, dbOpenDynaset)
If Not mittRS2.EOF Then
If IsNull(mittRS2!MedelförPlaceringSv) Then
Label3.Caption = "Ingen placering i Sverige"
ElseIf IsNull(mittRS2!MedelförPlaceringEU) Then
Label3.Caption = "Placering i Sverige: " & mittRS2!MedelförPlaceringSv
ElseIf IsNull(mittRS2!MedelförPlaceringVärlden) Then
Label3.Caption = "Placering i Sverige: " & mittRS2!MedelförPlaceringSv & " Placering i Europa: " & mittRS2!MedelförPlaceringEU
Else
Label3.Caption = "Placering i Sverige: " & mittRS2!MedelförPlaceringSv & " Placering i Europa: " & mittRS2!MedelförPlaceringEU & " Placering i Världen: " & mittRS2!MedelförPlaceringVärlden
End If
End If
SQL = "SELECT t_SongTitlar.songtitel, " &_
" cdbl(sum(t_Datum.PlaceringSv))/cdbl((select iif(count(*)=0,1,count(*)) from t_datum " & _
" where sång_id = st.titel_id " &_
" and placeringSv /= 0)) AS MedelförPlaceringSv, " & _
" cdbl(sum(t_Datum.PlaceringEu))/cdbl((select iif(count(*)=0,1,count(*)) from t_datum " & _
" where sång_id = st.titel_id " &_
" and placeringEu /= 0)) AS MedelförPlaceringEu, " & _
" cdbl(sum(t_Datum.PlaceringVärlden))/cdbl((select iif(count(*)=0,1,count(*)) from t_datum " & _
" where sång_id = st.titel_id " &_
" and placeringVärlden /= 0)) AS MedelförPlaceringVärlden " & _
" FROM t_SongTitlar as st INNER JOIN t_Datum as td ON ts.titel_Id = td.Sång_ID " & _
" where t_SongTitlar.songtitel = '" & List1.Text & "'" & _
" GROUP BY ts.songtitel "
Det skulle bli enklare om du hade varsin tabell för placeringar på olika listor. I dem skulle du bara ha poster för de datum då en viss låt hade en placering. I så fall skulle du kunna använda avg direkt. (Det kanske för med sig andra nackdelar dock).
Du kan bestämma antalet decimaler med hjälp av funktionerna ROUND eller Formatnumber.
Tack LarsG.
Decimalerna hittade jag i en gammal ASP bok.
Att göra om databasen och ändra listorna blir nog förmycket jobb.
Jag skall testa din kod och kolla.
Tack för din hjälp
Ursprungligen av sawJag kan inte göra det(tror jag) jag jobbar just nu i VB 6.0
När jag kör debug.print sql så har jag fått fram detta:
SELECT st.songtitel, cdbl(sum(td.PlaceringSv))/cdbl((select iif(count(*)=0,1,count(*)) from t_datum where sång_id = st.titel_id and placeringSv <>= 0)) AS MedelförPlaceringSv, cdbl(sum(td.PlaceringEu))/cdbl((select iif(count(*)=0,1,count(*)) from t_datum where sång_id = st.titel_id and placeringEu <>= 0)) AS MedelförPlaceringEu, cdbl(sum(td.PlaceringVärlden))/cdbl((select iif(count(*)=0,1,count(*)) from t_datum where sång_id = st.titel_id and placeringVärlden <>= 0)) AS MedelförPlaceringVärlden FROM t_SongTitlar st INNER JOIN t_Datum td ON st.titel_Id = td.Sång_ID where st.songtitel = 'Beautiful Words' GROUP BY st.songtitel
När jag kör debug.print sql så har jag fått fram detta:
SELECT st.songtitel, cdbl(sum(td.PlaceringSv))/cdbl((select iif
(count(*)=0,1,count(*)) from t_datum where
sång_id =
st.titel_id and placeringSv <>= 0)) AS MedelförPlaceringSv, cdbl
(sum(td.PlaceringEu))/cdbl((select iif(count(*)=0,1,count(*)) from t_datum where sång_id = st.titel_id
and placeringEu <>= 0))
AS MedelförPlaceringEu, cdbl(sum(td.PlaceringVärlden))/cdbl
((select iif(count(*)=0,1,count(*)) from t_datum
where sång_id = st.titel_id and placeringVärlden <>= 0))
AS
MedelförPlaceringVärlden FROM t_SongTitlar st INNER JOIN t_Datum td ON st.titel_Id = td.Sång_ID
where st.songtitel
= 'Beautiful Words' GROUP BY st.songtitel
Nej, jag ser inget direkt fel. Det kan ju vara att Access inte gillar iif och count(*) t.ex. Du kan ju testa och ta bort dom och se vad som händer.
SELECT st.songtitel,
cdbl(sum(td.PlaceringSv))/
cdbl((select count(*)
from t_datum
where sång_id = st.titel_id
and placeringSv <>= 0)) AS MedelförPlaceringSv,
cdbl(sum(td.PlaceringEu))/
cdbl((select count(*)
from t_datum
where sång_id = st.titel_id
and placeringEu <>= 0)) AS MedelförPlaceringEu,
cdbl(sum(td.PlaceringVärlden))/
cdbl((select count(*)
from t_datum
where sång_id = st.titel_id
and placeringVärlden <> = 0)) AS MedelförPlaceringVärlden
FROM t_SongTitlar st INNER JOIN
t_Datum td ON st.titel_Id = td.Sång_ID
where st.songtitel = 'Beautiful Words'
GROUP BY st.songtitel
SELECT st.songtitel,
cdbl(sum(td.PlaceringSv))/
cdbl((select iif(count(*)=0,1,count(*))
from t_datum inner join t_SongTitlar
on titel_Id = Sång_ID
where placeringSv <> 0
and songtitel = st.songtitel)) AS MedelförPlaceringSv,
cdbl(sum(td.PlaceringEu))/
cdbl((select iif(count(*)=0,1,count(*))
from t_datum inner join t_SongTitlar
on titel_Id = Sång_ID
where placeringEu <> 0
and songtitel = st.songtitel)) AS MedelförPlaceringEu,
cdbl(sum(td.PlaceringVärlden))/
cdbl((select iif(count(*)=0,1,count(*))
from t_datum inner join t_SongTitlar
on titel_Id = Sång_ID
where placeringVärlden <> 0
and songtitel = st.songtitel)) AS MedelförPlaceringVärlden
FROM t_SongTitlar st INNER JOIN
t_Datum td ON st.titel_Id = td.Sång_ID
where st.songtitel = 'Beautiful Words'
GROUP BY st.songtitel