webForumDet fria alternativet

Summera

7 svar · 489 visningar · startad av devotion

devotionMedlem sedan jan. 20013 582 inlägg
#1

Hej!

Jag har följande sql-fråga, som summerar ett antal tidtyper

SELECT COALESCE(SUM(tblTime.[Time]),0) AS Hours 
FROM tblcustomer 
	INNER JOIN tblTask ON tblCustomer.[Nr] = tblTask.CustomerNr 
		LEFT JOIN tblTime ON tblTask.[Id] = tblTime.TaskId 
		LEFT JOIN tblTimeType ON tblTimeType.[Id] = tblTime.TimeTypeId 
WHERE tblCustomer.Category = 'Sigtuna' 
	And tblTime.StartDate >='2008-06-01 00:00:00.000'
	And tblTime.StartDate < '2008-06-30 23:59:59.999' 
	And convert(varchar(8),startDate,8) between '07:30:00' and '16:30:00'
	And 
		( 
		[tblTimeType].[Name] like '01%' Or
		[tblTimeType].[Name] like '02%' Or
		[tblTimeType].[Name] like '03%' Or
		[tblTimeType].[Name] like '04%' Or
		[tblTimeType].[Name] like '05%' Or
		[tblTimeType].[Name] like '06%' Or
		[tblTimeType].[Name] like '07%' Or
		[tblTimeType].[Name] like '08%'
		)

Summan blir: 926,14 timmar

Om jag tar bort den nedre where-delen enligt:

SELECT COALESCE(SUM(tblTime.[Time]),0) AS Hours 
FROM tblcustomer 
	INNER JOIN tblTask ON tblCustomer.[Nr] = tblTask.CustomerNr 
		LEFT JOIN tblTime ON tblTask.[Id] = tblTime.TaskId 
		LEFT JOIN tblTimeType ON tblTimeType.[Id] = tblTime.TimeTypeId 
WHERE tblCustomer.Category = 'Sigtuna' 
	And tblTime.StartDate >='2008-06-01 00:00:00.000'
	And tblTime.StartDate < '2008-06-30 23:59:59.999' 
	And convert(varchar(8),startDate,8) between '07:30:00' and '16:30:00'

Så blir summan: 971,44 timmar

Differensen blir 45,3 timmar

Hur gör jag om ovanstående SQL-fråga, så att jag får ut 45,3 timmar?

Mvh
Henrik

Peter SMedlem sedan dec. 20025 483 inlägg
#2

Ställ båda frågorna och ta differensen mellan deras resultat ;)

Om vi vänder litet på det: Vad har de poster som utgör de 45,3 timmarna gemensamt? Kan vi hitta på en helt ny fråga utifrån vad vi vet om dessa?

devotionMedlem sedan jan. 20013 582 inlägg
#3

Hej!

Detta är gemensamt:

[tblTimeType].[Name] like '01%' Or
		[tblTimeType].[Name] like '02%' Or
		[tblTimeType].[Name] like '03%' Or
		[tblTimeType].[Name] like '04%' Or
		[tblTimeType].[Name] like '05%' Or
		[tblTimeType].[Name] like '06%' Or
		[tblTimeType].[Name] like '07%' Or
		[tblTimeType].[Name] like '08%'

Dvs alla poster som inte matchas får träff på ovanstående!

Mbh
Henrik

Peter SMedlem sedan dec. 20025 483 inlägg
#4

Men enbart de villkoren ger inte en summa på 45,3. Frågan är vad posterna mer har gemensamt?

Annars kan du lösa det på t.ex. följande vis:

select sum(t.time) as foo
  from tbltime t
 where t.id in
(
SELECT tblTime.[id]
FROM tblcustomer 
	INNER JOIN tblTask ON tblCustomer.[Nr] = tblTask.CustomerNr 
		LEFT JOIN tblTime ON tblTask.[Id] = tblTime.TaskId 
		LEFT JOIN tblTimeType ON tblTimeType.[Id] = tblTime.TimeTypeId 
WHERE tblCustomer.Category = 'Sigtuna' 
	And tblTime.StartDate >='2008-06-01 00:00:00.000'
	And tblTime.StartDate < '2008-06-30 23:59:59.999' 
	And convert(varchar(8),startDate,8) between '07:30:00' and '16:30:00'
EXCEPT
SELECT tblTime.[id]
FROM tblcustomer 
	INNER JOIN tblTask ON tblCustomer.[Nr] = tblTask.CustomerNr 
		LEFT JOIN tblTime ON tblTask.[Id] = tblTime.TaskId 
		LEFT JOIN tblTimeType ON tblTimeType.[Id] = tblTime.TimeTypeId 
WHERE tblCustomer.Category = 'Sigtuna' 
	And tblTime.StartDate >='2008-06-01 00:00:00.000'
	And tblTime.StartDate < '2008-06-30 23:59:59.999' 
	And convert(varchar(8),startDate,8) between '07:30:00' and '16:30:00'
	And 
		( 
		[tblTimeType].[Name] like '01%' Or
		[tblTimeType].[Name] like '02%' Or
		[tblTimeType].[Name] like '03%' Or
		[tblTimeType].[Name] like '04%' Or
		[tblTimeType].[Name] like '05%' Or
		[tblTimeType].[Name] like '06%' Or
		[tblTimeType].[Name] like '07%' Or
		[tblTimeType].[Name] like '08%'
		)
)
devotionMedlem sedan jan. 20013 582 inlägg
#5

Men, det som är gemensamt är ju att posterna INTE innehåller 01, 02, 03 osv...

Eller är jag trög? :)

Peter SMedlem sedan dec. 20025 483 inlägg
#6

I sådana fall är det följande du vill ha:

SELECT COALESCE(SUM(tblTime.[Time]),0) AS Hours 
FROM tblcustomer 
	INNER JOIN tblTask ON tblCustomer.[Nr] = tblTask.CustomerNr 
		LEFT JOIN tblTime ON tblTask.[Id] = tblTime.TaskId 
		LEFT JOIN tblTimeType ON tblTimeType.[Id] = tblTime.TimeTypeId 
WHERE tblCustomer.Category = 'Sigtuna' 
	And tblTime.StartDate >='2008-06-01 00:00:00.000'
	And tblTime.StartDate < '2008-06-30 23:59:59.999' 
	And convert(varchar(8),startDate,8) between '07:30:00' and '16:30:00'
	And [red]Not[/red]
		( 
		[tblTimeType].[Name] like '01%' Or
		[tblTimeType].[Name] like '02%' Or
		[tblTimeType].[Name] like '03%' Or
		[tblTimeType].[Name] like '04%' Or
		[tblTimeType].[Name] like '05%' Or
		[tblTimeType].[Name] like '06%' Or
		[tblTimeType].[Name] like '07%' Or
		[tblTimeType].[Name] like '08%'
		)
devotionMedlem sedan jan. 20013 582 inlägg
#7

Ibland är lösningen enklare än man tror....

Tack! :)

Mvh
Henrik

devotionMedlem sedan jan. 20013 582 inlägg
#8

Hej igen!

Skulle man inte kunna få ut båda resultaten i samma fråga?

Mvh
Henrik

134 ms totalt · 3 externa anrop · v20260731065814-full.16f3d68c
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)