OM jag öppnar ett RS och vill få summan av de 5 högsta talen av 6 tillgängliga tal och skriva ner den summan till en egen post hur gör man då ? Ska det bli en post i samma tabell? Hur håller du då sen isär summorna från de riktiga värdena, summorna kommer ju alltid vara högre än ursprungsvärdena? Temptabell är helt onödigt. En vy löser det effektivare. Hej! SELECT SUM(fldTal) FROM (SELECT TOP 5 fldTal FROM tblTabell ORDER BY fldTal DESC) ? Tabellen ser ut som så här Okej, jag tror det bästa är att göra en SP. Skrev ihop en (ful lösning med den fungerar iallafall. Varför har du denna datastruktur? Kan du ändra datastrukturen? Vad använder du för databasmotor? Skum tabellstruktur måste jag hålla med Andreas om... Men här är iaf ett förslag som löser problemet. Jag vet inte om det är den snabbaste lösningen men det är ju iaf bättre än en cursor.Summa av 5högsta värden i ett RS
Eller finns det något annat bra sätt att lösa det
ex: select top 5 .. osv, ?
Inget problem att hämta de 5 högsta på det viset men kruxet är ju att skriva ner den i totalen ?
/RSv: Summa av 5 högsta värden i ett RS
Jag lattjade lite med att få en snygg SQL-sats för detta, att selecta top 5 och sedan summera, men till sist tänkte jag "struktur"!
Man ska inte se ner på att använda temptabeller...
Vad sägs om vidstående (antar att summorna läggs i en egen tabell):
select top 5 * into #top_values from tblMinTabell order by colMinKolumn desc
insert into tblSummor (colSumma) values (select sum(colMinKolumn) from #top_values
/GöranSv: Summa av 5 högsta värden i ett RS
Sv: Summa av 5högsta värden i ett RS
Detta borde fixa det hela
SELECT sum (tal) FROM tabelnamn WHERE tal IN
(SELECT TOP 5 tal FROM tabelnamn ORDER BY tal DESC)
// ThomasSv: Summa av 5högsta värden i ett RS
Sv: Summa av 5högsta värden i ett RS
Id,tal1,tal2,tal3,tal4,tal5,tal6,total
Om man vill att en sql sats ska köra igenom alla rader i tabellen oh summera de 5högsta talen till total kolumnen hur ska den då se ut?
Sorry om ja svamla lite nyss...
/RSv: Summa av 5högsta värden i ett RS
jag har döpt tabellen till tal i övrigt stämmer det med dina uppgifter
-- kod börjar här
CREATE proc dbo.summera
as
declare @tal1 int
declare @tal2 int
declare @tal3 int
declare @tal4 int
declare @tal5 int
declare @tal6 int
declare @id int
declare @min int
declare @total int
DECLARE @tablename sysname
DECLARE myCursor CURSOR FOR SELECT * FROM tal
OPEN myCursor
FETCH NEXT FROM myCursor INTO @id,@tal1,@tal2,@tal3,@tal4,@tal5,@tal6,@total
WHILE (@@FETCH_STATUS = 0)
BEGIN
select @min = @tal1
if @min>@tal2 begin select @min = @tal2 end
if @min>@tal3 begin select @min = @tal3 end
if @min>@tal4 begin select @min = @tal4 end
if @min>@tal5 begin select @min = @tal5 end
if @min>@tal6 begin select @min = @tal6 end
select @total = @tal1+@tal2+@tal3+@tal4+@tal5+@tal6-@min
update tal set total = @total where id = @id
FETCH NEXT FROM myCursor INTO @id,@tal1,@tal2,@tal3,@tal4,@tal5,@tal6,@total
END
CLOSE myCursor
DEALLOCATE myCursor
GO
-- Kod slutar här
Hoppas att detta löser dina problem
// ThomasSv: Summa av 5högsta värden i ett RS
Sv: Summa av 5högsta värden i ett RS
<code>
CREATE VIEW totals
AS
SELECT x.id, SUM(y.num) - MIN(y.num) total
FROM tal x
INNER JOIN (
SELECT id, tal1 AS num FROM tal
UNION ALL
SELECT id, tal2 AS num FROM tal
UNION ALL
SELECT id, tal3 AS num FROM tal
UNION ALL
SELECT id, tal4 AS num FROM tal
UNION ALL
SELECT id, tal5 AS num FROM tal
UNION ALL
SELECT id, tal6 AS num FROM tal
) y ON x.id = y.id
GROUP BY x.id
UPDATE tal SET total = (SELECT total FROM totals WHERE totals.id = tal.id)
</code>