111945
Goto Top

SQL GROUP BY Convert Datetime

Hallo Zusammen,

ich sitze schon seit gefühlten Stunden an nem Script, ist wahrscheinlich sehr simpel, jedoch seh ich den Wald vor lauter Bäumen nicht.

Im Grunde will ich Zeiten in Tage zusammenfassen. Die Tabelle gibt werte vor wie z.B.

ACD Connected 2014-08-12 18:31:14.130
ACD Connected 2014-08-12 18:40:37.640
ACD Connected 2014-08-13 09:24:38.240
ACD Connected 2014-08-13 09:26:17.947


Ich möchte eine Ausgabe nach Tagen zusammenfasst.

ACD Connected 2014-08-12
ACD Connected 2014-08-13


Ich habs schon Convertiert [ Convert(varchar(10), Datum, 104) ] Wenn ich es jedoch per Group by zusammenfassen möchte, funktioniert dies nicht. Des weiteren kriege ich kein Ergebnis wenn ich nach "12.08.2014" suche.

Ich hoffe ihr habt eine Idee.

Grüße
Stefan

Content-Key: 247056

Url: https://administrator.de/contentid/247056

Printed on: April 16, 2024 at 18:04 o'clock

Member: emeriks
emeriks Aug 21, 2014 updated at 14:02:53 (UTC)
Goto Top
Hi,
nen bisschen Codezeile wäre schon hilfreich.
E.
Mitglied: 111945
111945 Aug 21, 2014 at 14:03:13 (UTC)
Goto Top
Hallo,

Könnte so aussehen

SELECT b.Name
,a.Action
,Convert(varchar(10), a.PhoneCallStart , 104)
FROM dbo.Skills b
,dbo.ReportInboundCallTracking a
Where a.SkillID = b.ID and Action = 'Connected' and b.Name = 'ACD-Zentrale'
GROUP BY b.Name, a.Action, a.PhoneCallStart
Member: emeriks
emeriks Aug 21, 2014 at 15:17:37 (UTC)
Goto Top
Was für ein SQL Server ist denn dahinter?
In MSSQL würde ich jetzt der Spalte mit den konvertierten Werten explit einen Namen zu geben um dann darüber zu gruppieren.
Also etwa so:

SELECT	b.Name, a.Action, Convert(varchar(10), a.PhoneCallStart , 104) as PCS
FROM	dbo.Skills b,dbo.ReportInboundCallTracking a
WHERE   a.SkillID = b.ID and Action = 'Connected' and b.Name = 'ACD-Zentrale'  
GROUP BY b.Name, a.Action, PCS

E.
Member: Biber
Biber Aug 21, 2014, updated at Aug 29, 2014 at 07:39:41 (UTC)
Goto Top
Moin StfnCstr,

ausgehend von deinem Statement entweder:
SELECT b.Name
, a.Action
, Convert(varchar(10), a.PhoneCallStart , 104), Count(b.Name) as Anzahl
FROM dbo.Skills b
,dbo.ReportInboundCallTracking a
Where a.SkillID = b.ID and Action = 'Connected' and b.Name = 'ACD-Zentrale'  
GROUP BY b.Name, a.Action, Convert(varchar(10), a.PhoneCallStart , 104)

- oder-
SELECT Name, Action PhoneCallDay, Count(*) as Anzahl
FROM ( 
    SELECT b.Name, a.Action
                , Convert(varchar(10), a.PhoneCallStart , 104) as PhoneCallDay
    FROM dbo.Skills b
            , dbo.ReportInboundCallTracking a
   WHERE a.SkillID = b.ID and Action = 'Connected' and b.Name = 'ACD-Zentrale'  
) x

GROUP BY Name, Action, PhoneCallDay

Den vergebenen Aliasnamen für eine Spalte schon im GROUP BY zu erkennen... das können nur modernere Datenbanken.
Glaube nicht, dass MSSQL das kann.

Anmerkung:das ", Convert(varchar(10), a.PhoneCallStart , 104)" ist eigentlich eine Konvertierung rein zu Display/Reportingzwecken.
Schnell ist diese Konvertierung nicht und zum Sortieren ungeeignet.
Ich würde das GROUP BY nach
 ....
  SELECT ....
   , CAST( FLOOR( CAST( a.PhoneCallStart AS FLOAT ) ) AS DATETIME) as AnrufTach
...machen und diesen "Anruftach" dann mit CONVERT(..) optisch aufhybschen.

Bei dieser Mimik wird aus zb "2014-08-13 09:26:17.947" ein "2014-08-13 00:00:00.000" (also der Tag ohne Std/Min/Sek), aber es nach wie vor ein Datumstyp datetime, was für die Sortierung(sgeschwindigkeit) relevant ist. Und bei vielen Daten ist es wirklich spürbar schneller.

Anmerkung 2
Wenn mit der WHERE-Bedingung wirklich schon eingeschränkt wird "Where .... Action = 'Connected' and b.Name = 'ACD-Zentrale'", dann brauchst du die Felder a.Action und b.Name weder per SELECT holen noch danach gruppieren..

Dann reicht ein ein "SELECT 'ACD-Zentrale' as Name, 'Connected' as Action, {andere Felder ] FROM ...GROUP BY..."

Grüße
Biber