Har en Temptabell #LicenceResult (LicNbr char(20), Result int, Rounds int) Ska vi börja uppifrån: Ok du ska få hela: Tog bort den del som lägger upp poster i #LicenceResult för att sedan summera posterna i #LicenceResult2 Helt ok, Gert. Jag vill få ut snittresultat av alla Matchresultat och Tävlingsresultat. Kanske inte helt, men jag fortsätter att fråga tills jag förstår. Hej Håkan, Gör det, detta går att göra bättre/snabbare.Uppdatera från en annan tabell med invecklad koll SQL
Som jag fylller med poster typ
'M600318GER01', 43100,223
'M041062MIC01', 44072,222
Jag måste kolla om Rounds >12
Om det är större än 12 så skall en tabell uppdateras med spelarens HCP
Annars ska det gamla värde stå kvar.
Har kommit så här långt men jag får bara med summan av alla spelare till uppdateringfasen.
<codec#>
SELECT @varResult = Result, @varRounds = Rounds, @varAverage = ROUND(Result/Rounds,0)
FROM #LicenceResult2
WHERE @varRounds > 0;
SET @parmDateToCompareTo = '2008-12-31'
SET @parmAverageFrom = 150;
SET @parmAverageTo = 210;
SET @parmPercent = 70;
IF (@varRounds > 12)
BEGIN
SELECT @varAverage = @varResult / @varRounds FROM #LicenceResult2 INNER JOIN
bo_Licence ON ((LicenceResultLicNbr COLLATE SQL_Latin1_General_CP1_CI_AS) = LicNbr);
/*WHERE ((LicNbr = 'M180360GER01') OR (LicNbr = 'M041062MIC01'))*/ ;
PRINT 'Över 12';
END
ELSE
BEGIN
--@varAverage = 0.00
PRINT 'Under 12';
END
SET @varAverage = @varAverage; -- Returnera Snitt
-- Average must be at least AverageFrom-value
IF (@varAverage < @parmAverageFrom)
BEGIN
SELECT @varAverage = @parmAverageFrom FROM #LicenceResult2 INNER JOIN
bo_Licence ON ((LicenceResultLicNbr COLLATE SQL_Latin1_General_CP1_CI_AS) = LicNbr);
END
-- Average must be max AverageTo-value
IF (@varAverage > @parmAverageTo)
BEGIN
SELECT @varAverage = @parmAverageTo FROM #LicenceResult2 INNER JOIN
bo_Licence ON ((LicenceResultLicNbr COLLATE SQL_Latin1_General_CP1_CI_AS) = LicNbr);
END
SELECT @parmHcp = (@parmAverageTo - @varAverage) * (@parmPercent * 0.01) FROM #LicenceResult2 INNER JOIN
bo_Licence ON ((LicenceResultLicNbr COLLATE SQL_Latin1_General_CP1_CI_AS) = LicNbr);
IF(@parmPercent=70 AND @parmAverageFrom = 150 AND @parmAverageTo = 210) -- EJ om annan typ av Hcp än Dyn. Hcp
BEGIN
-- Hcp must be max 3 points more than old Hcp
SELECT @varHcp = OldHcp
FROM dbo.bo_Licence
/*WHERE LicNbr = 'M180360GER01';--@parmLicNbr*/
IF (@@rowcount > 0)
BEGIN
IF (((@varHcp + 3) < @parmHcp) AND @varHcp >= 0)
BEGIN
SET @parmHcp = @varHcp + 3;
END
END
END
IF(@varResult IS NULL)
BEGIN
SET @parmHcp = @varHcp;
END
DELETE FROM dbo.bo_LicenceHcp
WHERE LicenceHcpDate = @parmDateToCompareTo ;
INSERT INTO bo_LicenceHcp (LicenceHcpLicNbr, LicenceHcpDate)
SELECT LicNbr, @parmDateToCompareTo
FROM bo_Licence
IF (@varHcp IS NOT NULL AND @varHcp>=0)
BEGIN
UPDATE bo_LicenceHcp
SET LicenceHcp = isnull(@varHcp,-1)
FROM #LicenceResult2
WHERE (((LicenceHcpLicNbr COLLATE SQL_Latin1_General_CP1_CI_AS) =
LicenceResultLicNbr) AND (LicenceHcpDate = @parmDateToCompareTo))
END
</code>Sv: Uppdatera från en annan tabell med invecklad koll SQL
Första SELECT satsen:
<code>
SELECT @varResult = Result, @varRounds = Rounds, @varAverage = ROUND(Result/Rounds,0)
FROM #LicenceResult2
WHERE @varRounds > 0;
</code>
Gert, den är helt ologisk, tyvärr.
Du tilldelar variabeln @varRounds ett värde i SELECTen, och samtidigt försöker använda den i WHERE satsen.
Om den fungerar så får du som bäst den sista träffen i temptabellen i variabeln @varResult.
Dessa variabler kan bara ha ett värde åt gången, ok?
Verkar som du vill hämta ut alla värden från temptabellen som är större än noll?
SELECT * FROM #LicenceResult2 WHERE (rounds > 0);
Du kallar temptabellen för #LicenceResult i början av din text, men sedan ser jag bara #LicenceResult2 i koden, är de samma?
Sv:Uppdatera från en annan tabell med invecklad koll SQL
SET NUMERIC_ROUNDABORT OFF;
SET ARITHABORT ON;
SET NOCOUNT ON;
DECLARE @parmLicNbr CHAR(20),@parmDateToCompareFrom DATETIME, @parmDateToCompareTo DATETIME, @parmPercent int;
SET @parmLicNbr = 'M180360GER01';
SET @parmDateToCompareFrom = '2007-07-01';
SET @parmDateToCompareTo = '2008-12-31';
CREATE TABLE #LicenceResult (LicenceResultLicNbr char(20), Result DECIMAL(10,2), Rounds int);
CREATE TABLE #LicenceResult2 (LicenceResultLicNbr char(20), Result DECIMAL(18,2), Rounds float);
-- Tävlingar !!!
INSERT INTO #LicenceResult
SELECT
ResultLicNbr,
(ResultRoundResult0 + ResultRoundResultDesperado + ResultRoundResult1 +
ResultRoundResult2 + ResultRoundResult3 + ResultRoundResult4 + ResultRoundResult5 +
ResultRoundResult6 + ResultRoundResult7 + ResultRoundResult8 + ResultRoundResult9 +
ResultRoundResult10) -
(ResultHcp * (ResultRoundNumber0 + ResultRoundNumberDesperado + ResultRoundNumber1 +
ResultRoundNumber2 + ResultRoundNumber3 + ResultRoundNumber4 + ResultRoundNumber5 +
ResultRoundNumber6 + ResultRoundNumber7 + ResultRoundNumber8 + ResultRoundNumber9 + ResultRoundNumber10)) AS Result,
(ResultRoundNumber0 + ResultRoundNumberDesperado + ResultRoundNumber1 +
ResultRoundNumber2 + ResultRoundNumber3 + ResultRoundNumber4 + ResultRoundNumber5 +
ResultRoundNumber6 + ResultRoundNumber7 + ResultRoundNumber8 + ResultRoundNumber9 +
ResultRoundNumber10) AS Rounds
FROM bo_Competition
INNER JOIN bo_Result ON (ResultID = Id /*AND ResultLicNbr = 'M180360GER01'@parmLicNbr*/)
INNER JOIN bo_class ON (ClassId = ResultId AND ClassRowNbr = ResultRowNbr)
LEFT OUTER JOIN bo_rank ON (RankType = ClassType AND RankPlace = ResultPlace)
WHERE (ResultRoundResult0) - (ResultHcp * (ResultRoundNumber0)) > 0 AND
EndDate >= @parmDateToCompareFrom AND EndDate <= @parmDateToCompareTo;
-- Matcher !!!
INSERT INTO #LicenceResult
SELECT MatchResultLicNbr, CAST((MatchResultRoundResult1 + MatchResultRoundResult2 + MatchResultRoundResult3 + MatchResultRoundResult4 +
MatchResultRoundResult5 + MatchResultRoundResult6 + MatchResultRoundResult7 + MatchResultRoundResult8) AS DECIMAL(10, 2)) AS Result,
(Case When MatchResultRoundResult1 > 0 THEN 1 ELSE 0 END + Case When MatchResultRoundResult2 > 0 THEN 1 ELSE 0 END +
Case When MatchResultRoundResult3 > 0 THEN 1 ELSE 0 END + Case When MatchResultRoundResult4 > 0 THEN 1 ELSE 0 END +
Case When MatchResultRoundResult5 > 0 THEN 1 ELSE 0 END + Case When MatchResultRoundResult6 > 0 THEN 1 ELSE 0 END +
Case When MatchResultRoundResult7 > 0 THEN 1 ELSE 0 END + Case When MatchResultRoundResult8 > 0 THEN 1 ELSE 0 END) AS Rounds
FROM bo_Match INNER JOIN
bo_MatchResult ON (MatchResultMatchId = MatchId /*AND MatchResultLicNbr = 'M180360GER01' @parmLicNbr*/)
WHERE MatchDate >= @parmDateToCompareFrom AND MatchDate <= @parmDateToCompareTo AND MatchFinished = 1;
INSERT INTO #LicenceResult2
SELECT LicenceResultLicNbr, sum(Result) AS Result, sum(Rounds) AS Rounds--, sum(Result) / sum(Rounds) AS Average
FROM #LicenceResult
GROUP BY LicenceResultLicNbr
--SELECT *,CAST(Result/rounds AS DECIMAL(5,2)) AS Snitt FROM #LicenceResult2 WHERE LicenceResultLicNbr = 'M041062MIC01'
-- SELECT * FROM #LicenceResult2 Where Rounds <13 ORDER BY ROUNDS DESC
--DROP TABLE #LicenceResult2
--DROP TABLE #LicenceResult
--DELETE #LicenceResult
DECLARE @parmAverageFrom int, @parmAverageTo int, @parmAverage int, @parmHcp int;
DECLARE @varResult DECIMAL(10, 2), @varRounds int, @varAverage DECIMAL(5, 2), @varHcp int;
--CAST(Result/Rounds AS DECIMAL(5,2)) AS Snitt,
SELECT @varResult = Result, @varRounds = Rounds, @varAverage = ROUND(Result/Rounds,0)
FROM #LicenceResult2
WHERE @varRounds > 0;
SET @parmDateToCompareTo = '2008-12-31'
SET @parmAverageFrom = 150;
SET @parmAverageTo = 210;
SET @parmPercent = 70;
IF (@varRounds > 12)
BEGIN
SELECT @varAverage = @varResult / @varRounds FROM #LicenceResult2 INNER JOIN
bo_Licence ON ((LicenceResultLicNbr COLLATE SQL_Latin1_General_CP1_CI_AS) = LicNbr);
/*WHERE ((LicNbr = 'M180360GER01') OR (LicNbr = 'M041062MIC01'))*/ ;
PRINT 'Över 12';
END
ELSE
BEGIN
--@varAverage = 0.00
PRINT 'Under 12';
END
SET @varAverage = @varAverage; -- Returnera Snitt
-- Average must be at least AverageFrom-value
IF (@varAverage < @parmAverageFrom)
BEGIN
SELECT @varAverage = @parmAverageFrom FROM #LicenceResult2 INNER JOIN
bo_Licence ON ((LicenceResultLicNbr COLLATE SQL_Latin1_General_CP1_CI_AS) = LicNbr);
END
-- Average must be max AverageTo-value
IF (@varAverage > @parmAverageTo)
BEGIN
SELECT @varAverage = @parmAverageTo FROM #LicenceResult2 INNER JOIN
bo_Licence ON ((LicenceResultLicNbr COLLATE SQL_Latin1_General_CP1_CI_AS) = LicNbr);
END
SELECT @parmHcp = (@parmAverageTo - @varAverage) * (@parmPercent * 0.01) FROM #LicenceResult2 INNER JOIN
bo_Licence ON ((LicenceResultLicNbr COLLATE SQL_Latin1_General_CP1_CI_AS) = LicNbr);
IF(@parmPercent=70 AND @parmAverageFrom = 150 AND @parmAverageTo = 210) -- EJ om annan typ av Hcp än Dyn. Hcp
BEGIN
-- Hcp must be max 3 points more than old Hcp
SELECT @varHcp = OldHcp
FROM dbo.bo_Licence
/*WHERE LicNbr = 'M180360GER01';--@parmLicNbr*/
IF (@@rowcount > 0)
BEGIN
IF (((@varHcp + 3) < @parmHcp) AND @varHcp >= 0)
BEGIN
SET @parmHcp = @varHcp + 3;
END
END
END
IF(@varResult IS NULL)
BEGIN
SET @parmHcp = @varHcp;
END
DELETE FROM dbo.bo_LicenceHcp
WHERE LicenceHcpDate = @parmDateToCompareTo ;
INSERT INTO bo_LicenceHcp (LicenceHcpLicNbr, LicenceHcpDate)
SELECT LicNbr, @parmDateToCompareTo
FROM bo_Licence
IF (@varHcp IS NOT NULL AND @varHcp>=0)
BEGIN
UPDATE bo_LicenceHcp
SET LicenceHcp = isnull(@varHcp,-1)
FROM #LicenceResult2
WHERE (((LicenceHcpLicNbr COLLATE SQL_Latin1_General_CP1_CI_AS) = LicenceResultLicNbr) AND (LicenceHcpDate = @parmDateToCompareTo))
END
PRINT @parmHcp
PRINT @parmAverageFrom
PRINT @parmAverageTo
PRINT @varAverage
PRINT @varHcp
Sv: Uppdatera från en annan tabell med invecklad koll SQL
Bra med helhet.
Men jag jobbar uppifrån och ner i flödet för att föröka förstå.
Så den SELECT satsen jag pekade på tidgare, gäller fortfarande.
Den är felaktig.
Kan du beskriva vad vill du göra/uppnå med den.Sv:Uppdatera från en annan tabell med invecklad koll SQL
Hcp beräknas enl följande (210 - snitt) *0,7
Och sedan kolla Spelarens senaste OldHcp som finns i LicenceHcp. LicNbr,Date och Hcp skall sedan tillbaks till bo_LicenceResult.
Men innan man skickar tillbaks OldHcp så ska det kollas så att man inte kan höja sig med mer än 3.
Sänka sig kan man göra hur mycket som helst ner till 0 i Hcp, men inte över 42.
Hoppas du förstår vad jag vill få fram.
Gert Sv: Uppdatera från en annan tabell med invecklad koll SQL
Det sista du gör är att uppdatera en tabell som heter bo_LicenceHcp.
Du tilldelar LicenceHcp ett nytt värde.
Är detta är ditt slutmål, att uppdatera en kolumn i bo_LicenceHcp?
Detta läser jag ut av din exempelkod.
Du skriver i texten ovan "LicNbr,Date och Hcp skall sedan tillbaks till bo_LicenceResult".
Det är tre kolumner och en helt annan tabell som ska uppdateras.Sv:Uppdatera från en annan tabell med invecklad koll SQL
Jag har inte svarat på tråden eftersom jag/vi fortsatte med den procedur som körs tidigare.
Problemet är bara att den tar ca 1,5 timmar att köra för att uppdatera ca 19 k poster.
Jag återkommer när jag får tid över att ta upp detta igen. Just nu så finns det andra saker på PRIO listan.
Tack för vad du gjort.
GertSv: Uppdatera från en annan tabell med invecklad koll SQL