Har en sql-sträng som ser ut enl. följande Det gör du enklast med UNION Hej. Vad är det som inte fungerar menar du? Låt säga att jag vill gruppera enl. ovan för perioden 1991-01-16 - 2001-01-15, 10 år. Har nu testkört med att bygga SQL-strängen med UNION som ovan men tyvärr så får jag felmeddelandet att frågan är för komplex när jag valde en längre tidsperiod.GROUP BY - Access
<code>SELECT Sum(Data.Kavg) AS Mförbr, Data.Date
FROM Data INNER JOIN IDPoint ON Data.PointID = IDPoint.PointID
WHERE (((IDPoint.PointID) In (3,4)) AND ((Data.Date) Between #1/16/1999# And #3/15/1999#))
GROUP BY Data.Date;</code>
Kan man köra en GROUP BY, och isåf hur, som grupperar enl. nedan:
Grupp 1: Sum(kavg) för data mellan 1999-01-16 - 1999-02-15
Grupp 2: Sum(kavg) för data mellan 1999-02-16 - 1999-03-15Sv: GROUP BY - Access
SELECT Sum(Data.Kavg) AS Mförbr, Data.Date
FROM Data INNER JOIN IDPoint ON Data.PointID = IDPoint.PointID
WHERE (((IDPoint.PointID) In (3,4)) AND ((Data.Date) Between #1/16/1999# And #2/15/1999#))
GROUP BY Data.Date
UNION
SELECT Sum(Data.Kavg) AS Mförbr, Data.Date
FROM Data INNER JOIN IDPoint ON Data.PointID = IDPoint.PointID
WHERE (((IDPoint.PointID) In (3,4)) AND ((Data.Date) Between #2/16/1999# And #3/15/1999#))
GROUP BY Data.DateSv:GROUP BY - Access
Det finns inte någon 'generell' lösning för t.ex om jag vill gruppera enl. ovan fast för datum mellan t.ex. 1/16/1991 och 3/15/2001. Problemet är att jag bygger ihop sql'en i kod och datumen varierar.Sv: GROUP BY - Access
Du får ju bygga upp SQL-strängen dynamiskt,
och stoppa in de datum du vill ha.
Antalen UNIONs kan du också göra dynamiskt enligt samma princip.Sv:GROUP BY - Access
Det skulle innebära 120 st UNIONs i SQL-strängen, men det kanske inte är några problem?
Jag har tidigare fått att SQL-syntaxen är för komplex när jag puttar in för många kriterier i IN satsen
<code> IDPoint.PointID IN (1,2,3 ...)</code>
Men jag testkör så får vi se.
/FredrikSv: GROUP BY - Access
Tillsvidare får jag köra med en inte alltför snygg nödlösning
<code>rs.Open "SELECT SUM(Kavg) as Mförbr, Data.Date
FROM (Data INNER JOIN IDPoint ON Data.PointID=IDpoint.PointID)
WHERE IDPoint.PointID IN (" & kstring & ") AND Data.Date Between
#" & Format(Mindat, "YYYY-MM-16") & "# AND #" & Format(Maxdat + 1, "YYYY-MM-15") & "#
GROUP BY Date"
rs.MoveFirst
kavg = 0
Do Until rs.EOF
If mDiagstap.avlm(rs!Date) = Mindat Then 'Funktionen avlm sätter ang.datum till
kavg = kavg + rs!Mförbr den siste i månaden d.v.s. både
rs.MoveNext 1999-01-16 och 1999-02-15 kommer
Else att sättas till 1999-01-31
...... kod när jag har komplett summa för kavg för aktuell månad
Mindat=MDiagstap.avlm(Mindat+20) 'Flyttar fram Mindat till den siste i nästa månad
End if
Loop
rs.close</code>
Förslag på förbättring mottages tacksamt.
/Fredrik