Reports: Dauer einer Anfrage

29. April 2011 15:26

Hallo Zusammen,

wie berechne ich am besten die Dauer einer Anfrage?

Wir haben überlegt die Differenz zwischen Erstelldatum Anfrage und Erstelldatum Anfragenabschluss zu nehmen (für bessere Vorschläge bin ich auch dankbar)

Aber wie sieht das SQL dazu aus?
Derzeit habe ich

Code:
SELECT        [test_MSCRM].[dbo].[FilteredIncident].incidentid
         , [test_MSCRM].[dbo].[FilteredIncident].createdon
         ,(Select [test_MSCRM].[dbo].[FilteredActivityPointer].createdon From [test_MSCRM].[dbo].[FilteredActivityPointer] where [test_MSCRM].[dbo].[FilteredActivityPointer].regardingobjectid = [test_MSCRM].[dbo].[FilteredIncident].incidentid)
FROM            [test_MSCRM].[dbo].[FilteredAccount] INNER JOIN
                         [test_MSCRM].[dbo].[FilteredIncident] ON [test_MSCRM].[dbo].[FilteredAccount].accountid = [test_MSCRM].[dbo].[FilteredIncident].new_companyid
WHERE        ([test_MSCRM].[dbo].[FilteredIncident].new_companyid = '83796e6e-61f0-de11-8a41-00188bc4ed5a') AND (DATEDIFF(m, [test_MSCRM].[dbo].[FilteredIncident].createdon, GETDATE()) <= 1)


Das Bringt mit aber folgenden Fehler

Meldung 512, Ebene 16, Status 1, Zeile 2
Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird.


Jemand eine Idee?

Der Subselect für sich alleine funktioniert, wenn ich im Where anstelle von [test_MSCRM].[dbo].[FilteredIncident].incidentid eine Anfragenid eintrage. mache ich das als Subslect bekomme ich jedoch wieder den Fehler

Danke Pascal

Re: Reports: Dauer einer Anfrage

6. Mai 2011 00:45

Hallo Pascal,
was ist genau gemeint mit "Dauer einer Anfrage"?
Ich frage mich warum du ein Subselect benutzt? Du kannst du auch auch einfach
SELECT [test_MSCRM].[dbo].[FilteredIncident].incidentid
, [test_MSCRM].[dbo].[FilteredIncident].createdon
, [test_MSCRM].[dbo].[FilteredActivityPointer].createdon
FROM [test_MSCRM].[dbo].[FilteredAccount] INNER JOIN
[test_MSCRM].[dbo].[FilteredIncident] ON [test_MSCRM].[dbo].[FilteredAccount].accountid = [test_MSCRM].[dbo].[FilteredIncident].new_companyid
[test_MSCRM].[dbo].[FilteredActivityPointer].regardingobjectid = [test_MSCRM].[dbo].[FilteredIncident].incidentid
WHERE ([test_MSCRM].[dbo].[FilteredIncident].new_companyid = '83796e6e-61f0-de11-8a41-00188bc4ed5a') AND (DATEDIFF(m, [test_MSCRM].[dbo].[FilteredIncident].createdon, GETDATE()) <= 1) machen. dann hast du die Anfrageid, das Erstelldatum Incident und Erstelldatum Anfrage drin.
Oder meintest du eher sowas wie
... WHERE DATEDIFF(DAY, [test_MSCRM].[dbo].[FilteredIncident].createdon, [test_MSCRM].[dbo].[Filteredactivitypointer].createdon) <= 0 AND DATEDIFF(DAY, [test_MSCRM].[dbo].[Filteredactivitypointer].createdon, [test_MSCRM].[dbo].[FilteredIncident].createdon) <= 0

Sorum könntest du es probieren, ansonsten über Dynamic SQL machen und für die Abfrage der Anfragen in einen eigenen Parameter setzen und diesen Parameter dann in deiner eigentlichen Abfrage benutzen.

Grüße
gE3z

Re: Reports: Dauer einer Anfrage

6. Mai 2011 10:45

Hallo,

ich habe die Dauer jetzt raus bekommen. Zumindest Ansatzweise.

Code:
SELECT       DATEDIFF(d, FilteredIncident.createdon, FilteredActivityPointer.createdon) as IncidentDureation,FilteredAccount.name, FilteredIncident.ticketnumber, FilteredIncident.createdon AS IncidentCreatedon, FilteredActivityPointer.createdon AS ActivityCreatedon,
                         FilteredActivityPointer.activitytypecodename,FilteredActivityPointer.activitytypecode
FROM            FilteredAccount INNER JOIN
                         FilteredIncident ON FilteredAccount.accountid = FilteredIncident.new_companyid right outer JOIN
                         FilteredActivityPointer ON FilteredIncident.incidentid = FilteredActivityPointer.regardingobjectid
where     (FilteredIncident.new_companyid = '83796e6e-61f0-de11-8a41-00188bc4ed5a')
order by incidentid


Dieses Select gibt mir alle Aktivitäten mit Allen Anfragen zurück.
Insgesamt 219 zeilen, wobei es sich um 29 Anfragen handelt

Füge ich dem Where jetzt
Code:
and FilteredActivityPointer.activitytypecode = 4206
hinzu, dann bekomme ich nur noch die Anfragen zurück, die auch einen Anfragenabschluss haben.

Bekomme ich es irgendwie hin, das ich alle Anfragen bekomme (29) und die Zeitdifference wenn ein Anfragenabschluss erstellt wurde?

Wenn es im SQL nicht geht, dann würd ich das auch irgendwie im Report lösen. Als Ergebnis möchte ich nur meine 29 Anfragen aufgelistet haben und als 2te Spalte die Dauer der Anfrage, bzw. ob sie noch offen ist, klar und noch ein paar andere Felder...

Viele Grüße
Pascal

Re: Reports: Dauer einer Anfrage

6. Mai 2011 12:12

Hallo Pascal,
ich frage mich warum du bei deiner From- Bedingung ein right outer join machst. Mache doch einfach ein Inner Join dann bekommst du auch nur die datensätze angezeigt welche an einer Anfrage und die an deiner Firma hängen zurück.

Wenn du den unteren Part machen möchtest dann musst du mit TempTables arbeiten, in diese Temp Table lädst du dann deine Anfragen rein und zusätzlich deine Abgeschlossenen.
Könnte irgendwie so aussehen
DECLARE @TempTable AS TABLE (Zeitdifferenz INT, Firmenname NVARCHAR(MAX), Anfragenummer NVARCHAR(MAX), DatumAnfrage DateTime, DatumAktivitaet DateTime, Aktivitätsname NVARCHAR(MAX), Typecode NVARCHAR(MAX))
INSERT INTO @TempTable
SELECT für deine normale abfrage
INSERT INTO @TempTable
SELECT für deine abgeschlossenen

Grüße
gE3z