MSSQL und SQL-Script

Sinepp

Registered User
Hallo Leute,

folgendes Thema. Eine Datenbank hat eine Tabelle, deren Spalten unter anderem sind:
cTimeReceipt (UnixTimestamp, plus Millisekunden, also 1234567890123), cStatus (kann 10, 20, 30, 40, 50, 60 als Wert haben) und das wars auch schon wieder an wichtigen Dingen.

Ich muss folgendes leisten:
Gebe mir alle Einträge aus dem Table vom aktuellen Tag von 0-24h, benenne den Inhalt der Spalte cStatus wenn Wert = 50 auf efax_booked, ansonsten in efax_norm und summiere alle efax_booked und efax_norm auf.

Mein Script sieht zur Zeit so aus:
Code:
DECLARE @startzeit 	char(10)
DECLARE @endzeit 	char(10)
DECLARE	@startmonat 	char(2)
DECLARE	@startjahr 	char(4)
DECLARE	@starttag 	char(2)
DECLARE	@startdatum 	char(19)
DECLARE	@cTimeReceipt	char(19)
DECLARE	@cStatus	char(2)
DECLARE @SystemID	char(12)
DECLARE @cLineObject	char(12)
DECLARE @NrOfRequests	char(10)


SET 		@startmonat = DATEPART(month, GETDATE())
SET 		@startjahr = DATEPART(year, GETDATE())
SET 		@starttag = DATEPART(day, GETDATE())
SET 		@startdatum = @startjahr +  '-' + @startmonat + '-' + @starttag + ' 00:00:00'
SET           	@startzeit = DATEDIFF([second], '1970-01-01 01:00:00', @startdatum)
SET		@endzeit = @startzeit+86399

print 'Startdatum: ' + @startdatum
print 'Startzeit: ' + @startzeit
print 'Endzeit: ' + @endzeit

DECLARE result_cursor CURSOR FOR
SELECT     	@startdatum AS Datum, 'System02' as SystemID, cStatus, Count(cTimeReceipt) AS NrOfRequests
FROM         	tTodoList_FF
WHERE     	LEFT(cTimeReceipt, 10) > @startzeit AND LEFT(cTimeReceipt, 10) < @endzeit
GROUP BY cStatus


open result_cursor 

FETCH NEXT FROM  result_cursor 
INTO @cTimeReceipt, @SystemID, @cStatus, @NrOfRequests

WHILE @@FETCH_STATUS = 0
BEGIN
	SET @SystemID = 'System02'
	
	
	IF (@cStatus <> '50')
	BEGIN
		SET @cLineObject = 'efax_norm'
	END
	ELSE
	BEGIN
		SET @cLineObject = 'efax_booked'
	END
	
	print @startdatum + ' ' + @SystemID + ' ' + @cLineObject + ' ' + @NrOfRequests
	FETCH NEXT FROM  result_cursor 
	INTO @cTimeReceipt, @SystemID, @cStatus, @NrOfRequests
END
CLOSE result_cursor
DEALLOCATE result_cursor
GO

Die Ausgabe:
Code:
Startdatum: 2006-12-27 00:00:00 [SQLSTATE 01000]
Startzeit: 1167174000 [SQLSTATE 01000]
Endzeit: 1167260399 [SQLSTATE 01000]
2006-12-27 00:00:00 System02 efax_norm    9 [SQLSTATE 01000]
2006-12-27 00:00:00 System02 efax_norm    1061 [SQLSTATE 01000]
2006-12-27 00:00:00 System02 efax_norm    14 [SQLSTATE 01000]
2006-12-27 00:00:00 System02 efax_booked  696 [SQLSTATE 01000]
2006-12-27 00:00:00 System02 efax_norm    177 [SQLSTATE 01000]
2006-12-27 00:00:00 System02 efax_norm    1 [SQLSTATE 01000]

Soweit ganz nett, nur wie man sieht wird efax_norm mehrmals gezählt, da sich dahinter ja in Wirklichkeit verschiedene Statuscodes verbergen, also z.B. 10, 20, 30, 40 und 60. Wie fasse ich das nun so zusammen, dass alle "norm" summiert werden? Meine erste Idee war "noch ein Cursor muss über den ersten Loopen..." weiß aber garnicht ob so etwas geht.

Vielleicht hat einer von Euch eine elegante Idee dazu.

Vielen Dank schonmal,

Grüße
Sinepp
 
Hiho.

Meine erste Idee war "noch ein Cursor muss über den ersten Loopen..." weiß aber garnicht ob so etwas geht.

Ja, geht.

Allerdings bei dem Wulst an Variablen den Du benutzt kann ein Counter (wie @NrOfRequests) mehr oder weniger auch nicht schaden und die einfache Fallunterscheidung
IF (@cStatus <> '50')
ist doch auch schon da, dann nur die Ausgabe ausserhalb des cursor machen und die Gruppierung weglassen die macht bei der Vorgehensweise keinen Sinn mehr?

Vielleicht moechtest Du auch noch die Abfrage auf den Zeitstempel -> cTimeReceipt
direkt mit @startdatum ohne Uhrzeit machen (evtl. LIKE clause nutzen).

Und zu guter Letzt, wenn Du die einzelnen Saetze gar nicht wirklich bearbeiten sondern nur zaehlen willst nimm doch ein angemessenes
SELECT COUNT () FROM tables WHERE ....
Reicht um das Ergebnis auszugeben, das Du da bekommst voll und ganz.
Das ist auch wesentlich performanter als der cursor, den brauchst Du nur, wenn Du die einzelnen Saetze auch im Griff haben musst z.B. um sie zu modifizieren.

Ciao,
Mercy.
 
Hi Mercy,

Deine Sache gab den Denkanstoss, es sieht nun so aus:

DECLARE @startzeit char(10)
DECLARE @endzeit char(10)
DECLARE @startmonat char(2)
DECLARE @startjahr char(4)
DECLARE @starttag char(2)
DECLARE @startdatum char(19)
DECLARE @cTimeReceipt char(19)
DECLARE @NrOfefaxNorm char(5)
DECLARE @NrOfefaxBook char(5)
DECLARE @NrOfefaxSumm char(5)


SET @startmonat = DATEPART(month, GETDATE())
SET @startjahr = DATEPART(year, GETDATE())
SET @starttag = DATEPART(day, GETDATE())
SET @startdatum = @startjahr + '-' + @startmonat + '-' + @starttag + ' 00:00:00'
SET @startzeit = DATEDIFF([second], '1970-01-01 01:00:00', @startdatum)
SET @endzeit = @startzeit+86399
SET @NrOfefaxNorm = (SELECT Count(*) FROM tTodoList_FF WHERE LEFT(cTimeReceipt, 10) > @startzeit AND LEFT(cTimeReceipt, 10) < @endzeit AND cStatus <> '50' )
SET @NrOfefaxBook = (SELECT Count(*) FROM tTodoList_FF WHERE LEFT(cTimeReceipt, 10) > @startzeit AND LEFT(cTimeReceipt, 10) < @endzeit AND cStatus = '50' )
SET @NrOfefaxSumm = CAST(@NrOfefaxBook AS int) + CAST(@NrOfefaxNorm AS int)

print 'Startdatum: ' + @startdatum
print 'Startzeit: ' + @startzeit
print 'Endzeit: ' + @endzeit

print @startdatum + ' System02 efax_norm ' + @NrOfefaxNorm
print @startdatum + ' System02 efax_book ' + @NrOfefaxBook
print @startdatum + ' System02 efax_summ ' + @NrOfefaxSumm
GO

und das Ergebnis so:
Startdatum: 2006-12-28 00:00:00
Startzeit: 1167260400
Endzeit: 1167346799
2006-12-28 00:00:00 System02 efax_norm 1188
2006-12-28 00:00:00 System02 efax_book 780
2006-12-28 00:00:00 System02 efax_summ 1968

Hab den Wald schon vor läuter Bäumen nicht mehr gesehen.

Habe während dem schreiben auch festgestellt, dass ich den FetchCursor tatsächlich nicht brauche. Hachja, aber nett ihn kennengelernt zu haben.

Danke nochmals und schönen Abend,

Sinepp
 
Hi Thorsten,

danke fürs Verschieben. Wäre nie auf die Idee gekommen unter Serverdienste zu gucken.

Grüße
Sinepp
 
Back
Top