Hejsan Om du först tar reda på senaste datumet med "SELECT TOP 1 datum FROM kommentarer DESC" eller liknande och sedan kör: Här kommer mitt bidrag. Vet inte hur bra det är. Men det är nog betydligt bättre än att köra underfrågorna. Tog ca 11sekunder med 262144poster. Så här ska man göra för att få fasta kolumnrubriker kom jag på... Hur gick det? Det skulle vara intressant att se prestandan på de oika alternativen... Jag har tyvärr ingen lämplig databas som jag kan testa på. Transform stödjs väl inte av SQL server. Har för mig att Transform inte är så snabb. Men en jämförelse skulle vara intressant... Möjligt att det inte fungerar, jag har inte möjligt att testa SQL-server... Jag kör access och trodde att SQL-server hade "allt + lite till". Rent logiskt sett borde Transform vara ganska långsamt då det är såpass kraftfullt... Man blir lite lätt "förälskad" i den... :O) Hejsan! Jag utgick ifrån att det gick att spara frågerna på servern. Query1 och Query2 är namnet på frågerna. Har för mig att MySQL inte stödjer sparade fråger(vyer) än.Problem med skalbarhet - Uträkningar på databasser
Om man förenklar min situation lite grann kan man säga att jag har en tabell "Kommentarer" med följande kolumner: objekt, område, datum, kommentar
Ett objekt har flera områden, datan kan tex se ut såhär:
Objekt1, Område1, 2001-01-01, Bra
Objekt1, Område1, 2001-01-01, Dåligt
Objekt1, Område2, 2001-01-01, Bra
Objekt1, Område2, 2001-01-01, Bra
Objekt1, Område1, 2001-02-02, Dåligt
Objekt1, Område1, 2001-02-02, Dåligt
Objekt1, Område2, 2001-02-02, Bra
Objekt1, Område2, 2001-02-02, Dåligt
Det jag ska göra med datan är att för varje objekt och område, med senaste datumet, räkna ut hur många procent av kommenterna som är tex "Dåligt".
Detta har jag åstadkommit med en ganska krånglig SQL-sats som ser ut såhär:
select Objekt, Område, Datum, count(Kommentar) as Antal, (Select count(Kommentar) as foo from Analys where Kommentar = 'Dåligt' and Område = x.Område and Objekt = x.Objekt and Datum = x.Datum) as AntalDåliga,
Left((antaldåliga / antal), 3) as ProcDåliga
From Kommentarer x
Where Datum = (SELECT MAX(Datum) From Kommentarer WHERE Objekt = x.Objekt AND Område = x.Område)
Group by Objekt, Område, Datum
Detta fungerar bra när det inte finns så många rader i databasen, men när man kommer upp emot 10 000 rader (vilket är väldigt lite) går det väldigt, väldigt slött och allt som oftast hänger sig VB.
Någon som möjligtvis kan hjälpa mig med att komma på något annat sätt att göra detta på? Kanske bättre att vb-programmet hämtar all nödvändig data och själv räknar hur många av raderna som har kommentaren "Dåliga"?
Väldigt tacksam för hjälp
/JohanSv: Problem med skalbarhet - Uträkningar på databa
TRANSFORM Count(Tabell2.kommentar)
SELECT objekt, område, datum
FROM Kommentarer
WHERE datum = ???
GROUP BY objekt, område, datum
PIVOT kommentar;
Med detta får du en post för varje grupp med en kolumn för varje alternativ som innehåller antalet.
Hoppas att detta kan var till någon hjälp, det kanske går fortare???
/JohanSv: Problem med skalbarhet - Uträkningar på databa
Du tjänar nog mycket på att skapa tabeller för Objekt, Område och betyg och använda nummer. Samt att indexera fälten.
Query1:
SELECT Table1.Objekt, Table1.Område, Max(Table1.Datum) AS MaxOfDatum
FROM Table1
GROUP BY Table1.Objekt, Table1.Område;
Query2:
SELECT Query1.Objekt, Query1.Område, Query1.MaxOfDatum, -Sum(Table1.Betyg="Bra") AS SumOfBetyg, Count(*) AS CountOfBetyg
FROM Query1 INNER JOIN Table1 ON (Query1.MaxOfDatum = Table1.Datum) AND (Query1.Område = Table1.Område) AND (Query1.Objekt = Table1.Objekt)
GROUP BY Query1.Objekt, Query1.Område, Query1.MaxOfDatum;Sv: Problem med skalbarhet - Uträkningar på databa
TRANSFORM Count(Tabell2.kommentar)
SELECT objekt, område, datum
FROM Kommentarer
WHERE datum = ???
GROUP BY objekt, område, datum
PIVOT kommentar IN ("Bra","Dåligt")
/JohanHur gick det?
/JohanSv: Hur gick det?
Sv: Hur gick det?
/JohanSv: Hur gick det?
Om man har fasta kolumner så finns det ett sätt man kan snabba upp den på. Påverkar inte detta fallet. Men låt oss säga att "Bra" och "Dåligt" inte var de enda alternativ som förekommer utan att det fanns en sådär 20st kanske. Då snabbar man upp frågan genom att placera samma In sats man använder för kolumrubriker i Where satsen.
Något sådan här:
TRANSFORM Count(Tabell2.kommentar)
SELECT objekt, område, datum
FROM Kommentarer
WHERE kommentar IN ("Bra","Dåligt")
GROUP BY objekt, område, datum
PIVOT kommentar IN ("Bra","Dåligt")
Då slipper Transfor behandla de poster som inte ska visas. Vilket kan göra mycket. Tipset är ju inte alltid tillämpbart.Sv: Hur gick det?
Tackar så hemskt mycket för förslagen. Jag har varit lite upptagen och därför inte hunnit kolla förrän nu.
Jag testade Johans metod med transform vilket fungerade mycket bättre än min slöa underfråga. Nu körde jag i access men om det inte fungerar i mssql så kan jag tyvärr inte använda det ändå.
Andreas metod fick jag inte att fungera riktigt. Visste inte att man kunde använda flera select-satser tillsammans sådär och det är också det jag inte riktigt förstår. Skriver jag "query1: ..." så klagas det på "query1". Jag kanske är dum, men hur gör man?Sv: Hur gick det?
Men du kan ju använda en temorär tabell istället för Query1. Frågan är om det är bättre eller smärre ur prestanda synpunkt. Man kan ju indexera den och på så sätt snabba upp join'en. Men att skapa poster tar ju resurser, samt indexera dem. Bara att testa och se.
DELETE * FROM MyTempTable
INSERT INTO MyTempTable (Objekt, Område, Datum)
SELECT Table1.Objekt, Table1.Område, Max(Table1.Datum) AS MaxOfDatum
FROM Table1
GROUP BY Table1.Objekt, Table1.Område;
SELECT MyTempTable.Objekt, MyTempTable.Område, MyTempTable.Datum, -Sum(Table1.Betyg="Bra") AS SumOfBetyg, Count(*) AS CountOfBetyg
FROM MyTempTable INNER JOIN Table1 ON (MyTempTable.Datum = Table1.Datum) AND (MyTempTable.Område = Table1.Område) AND (MyTempTable.Objekt = Table1.Objekt)
GROUP BY MyTempTable.Objekt, MyTempTable.Område, MyTempTable.Datum;