Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Uppdatera från en annan tabell med invecklad koll SQL

Postades av 2009-02-05 17:45:27 - Gert Lindholm, i forum sql-server/msde, Tråden har 7 Kommentarer och lästs av 1410 personer

Har en Temptabell #LicenceResult (LicNbr char(20), Result int, Rounds int)
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>


Svara

Sv: Uppdatera från en annan tabell med invecklad koll SQL

Postades av 2009-02-06 00:04:49 - Håkan Borneland

Ska vi börja uppifrån:
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?


Svara

Sv:Uppdatera från en annan tabell med invecklad koll SQL

Postades av 2009-02-06 10:50:08 - Gert Lindholm

Ok du ska få hela: Tog bort den del som lägger upp poster i #LicenceResult för att sedan summera posterna i #LicenceResult2

	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




Svara

Sv: Uppdatera från en annan tabell med invecklad koll SQL

Postades av 2009-02-06 13:47:31 - Håkan Borneland

Helt ok, Gert.
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.


Svara

Sv:Uppdatera från en annan tabell med invecklad koll SQL

Postades av 2009-02-06 14:49:35 - Gert Lindholm

Jag vill få ut snittresultat av alla Matchresultat och Tävlingsresultat.
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


Svara

Sv: Uppdatera från en annan tabell med invecklad koll SQL

Postades av 2009-02-06 19:44:15 - Håkan Borneland

Kanske inte helt, men jag fortsätter att fråga tills jag förstår.
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.


Svara

Sv:Uppdatera från en annan tabell med invecklad koll SQL

Postades av 2009-03-03 12:11:53 - Gert Lindholm

Hej Håkan,

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.

Gert


Svara

Sv: Uppdatera från en annan tabell med invecklad koll SQL

Postades av 2009-03-03 18:01:15 - Håkan Borneland

Gör det, detta går att göra bättre/snabbare.


Svara

Nyligen

  • 18:37 Remove the bumper in AUDI
  • 15:35 Chicken road crash game
  • 21:41 Automotive Services UK
  • 20:44 Erfarenhet av CBD-olja mot sömnpro
  • 12:13 Sex Dolls for Sale
  • 19:42 Online Casinos for Haitian Players
  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 889
27 965
271 778
1 115
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies