2016-08-31 5 views
0

Ich habe 3 Tabellen wie folgt.Verwirrende Summe Ergebnis

  1. Benutzer
  2. StatusTable
  3. Time_Tracker

Und die Beziehung ist als unten.

Benutzer haben username und userid, hat StatusTable userName und Time_Tracker hat userName

Im Folgenden meine Tabellendaten.

Und hier Ich versuche, die Summe

enter image description here

Problem zu erhalten:

ich die productiontime als Summe von time taken[minutes] aktualisieren möchten von case owner-username und TT.userId = Users.userId Beitritt und die login = GetDate()

Meine Abfrage ist

update Time_Tracker set ProductionTime = (select sum(ST.[time taken(minutes)]) 
from statustable as st inner join users as u 
on st.[case owner] = u.username 
inner join Time_Tracker as TT 
on u.userId = TT.userId 
where cast(st.[Start Time] AS DATE) = CAST(GETDATE() as Date) 
Group By TT.UserId, u.UserId) where CAST(Login AS DATE) = CAST(GETDATE() as Date) 

Und die blaue Box in meinem Bild ist meine aktuelle O/P.

Als ich

select sum([time taken(minutes)]) as totalTme from StatusTable where cast([Start Time] AS DATE) = CAST(GETDATE() as Date) 

laufen bekomme ich die O/p als 2.05 die richtige ist.

Bitte lassen Sie mich wissen, wo gehe ich falsch in meiner ersten Abfrage (Drucken 10.25) anstelle von 2.05.

Wie kann ich das beheben?

Dank

Antwort

2

Ich glaube, Sie join s in der Unterabfrage zu viele haben:

update Time_Tracker tt 
    set ProductionTime = (select sum(ST.[time taken(minutes)]) 
          from statustable st inner join 
           users u 
           on st.[case owner] = u.username 
          where u.userId = tt.userId and 
           cast(st.[Start Time] AS DATE) = CAST(GETDATE() as Date) 
         ) 
    where CAST(Login AS DATE) = CAST(GETDATE() as Date); 

Ihre Version für jede Zeile in TimeTracker das Ergebnis wird multipliziert wird. Die Korrelationsklausel ist was Sie brauchen.

Auch sehr wichtig. Solch eine korrelierte Unterabfrage sollte keine GROUP BY Klausel haben. Die GROUP BY könnte mehrere Zeilen zurückgeben, aber definitionsgemäß sollte die korrelierte Unterabfrage höchstens eine Zeile zurückgeben.

+0

Ja, rechts Ihre Abfrage gibt 5 mal Wert zurück, so können Sie sicherstellen, indem Sie den Wert vor der Aktualisierung auswählen. – Susang

+0

Hallo Freund, Danke für diese Lösung, das funktioniert wie Charme. Auch habe ich vergessen in meiner Frage zu erwähnen, gibt es einen Weg, wo ich das Session-Element während der Aktualisierung bekommen kann, wie 'where userid = session Element' – user3872094

+0

@ user3872094. . . Ich denke, du solltest eine neue Frage als Frage stellen und nicht in einem Kommentar. –