none
Join mit Range RRS feed

  • Frage

  • Hallo Experten,

    habe wieder ein Spezialabfrage zu erstellen. Ich soll das morgen präsentieren, vielleicht hat jemand eine Lösung für mich.

    Es geht um Telefongespräche die ich in der nachfolgenden, vereinfacht dargestellten Gesprächstabelle gespeichert habe.

    Von   DateTime
    Bis   DateTime

    Die nachfolgende Abfrage liefert mir die Anzahl der Gespräche pro Monat

    var anzgespr = _bucs
        .GroupBy(b => new { Jahr = b.Von.Year, Monat = b.Von.Month })
        .Select(b => new { b.Key.Jahr, b.Key.Monat, Anzahl = b.Count() })
        .ToList();


    Diese Abfrage müsste ich jetzt um die Gesprächsdauer erweitern. Und zwar abhängig von folgender Tabelle

    1	13	Bis 30 Sekunden 	001       	SEKUNDEN  	0       	30
    2	13	Bis 2 Minuten   	002       	SEKUNDEN  	30      	120
    3	13	Bis 10 Minuten	        003       	SEKUNDEN  	120     	600
    4	13	Bis 1 Stunde    	004       	SEKUNDEN  	600     	3600
    5	13	über 1 Stunde   	005       	SEKUNDEN  	3600    	9999999999999

    Liegt die Differenz (Tabelle Gespräche 'Bis' minus 'Von') in Sekunden innerhalb der Sekundenwerte (letze zwei Spalten der obigen Tabelle), so soll der entsprechende Wert aus Spalte 3 und 4 (oder auch nur eine der beiden Spalten) gruppiert werden und es sollen die Gespräche gezählt werden.

    Das Ergebnis soll dann symbolisch so aussehen:

    Jahr  Monat   Dauer                 Anzahl der Gespräche
    2014   01     Bis 30 Sekunden           4
    2014   01     Bis 2 Minuten            25
    2014   01     Bis 5 Minuten            10
    2014   02     Bis 30 Sekunden           9
    
    usw.

    Hat jemand eine Idee wie man das realisieren kann?

    Vielen Dank für Eure Hilfe

    Siegfried



    Dienstag, 2. Dezember 2014 11:49

Antworten

  • Hallo,
    ich verstehe glaube nicht so ganz, wie du was zusammen zählen willst.
    Ich gehe mal davon aus, dass du die Auswertung im Pro Monat haben willst. Für jeden Monat willst du dann heraus bekommen, wie viele Gespräche <30s, 20s<x<2min, 2min<x<10min usw. lang liefen. Das könnte in etwa mit folgendem Code funktionieren:

    var anzgespr = _bucs
        .GroupBy(b => new { Jahr = b.Von.Year, Monat = b.Von.Month })//Gruppierung nach Jahr und Monat
        .Select(x =>
            x.GroupBy(y => Category((y.Bis - y.Von).TotalSeconds))//Jeden Monat nach Gesprächslänge gruppieren
                .Select(y => new { Jahr = x.Key.Jahr, Monat = x.Key.Monat, Dauer = y.Key, Anzahl = y.Count() })//Jeweils nur die Anzahl mit Monat und Jahr zurück geben
                )
        .SelectMany(x => x)//Alle Unterlisten zu einer machen
        .ToList();
    Die Category-Methode erzeugt einen Key aus der Gesprächslänge:
    static int Category(double secs)
    {
        if (secs < 30)
            return 0;
        if (secs < 2 * 60)
            return 1;
        if (secs < 10 * 60)
            return 2;
        if (secs < 60 * 60)
            return 3;
        return 4;
    }
    Als Ergebnis erhältst du eine Liste mit den Eigenschaften Jahr und Monat sowie Dauer (Der Schlüssel der Category-Methode) und Anzahl der dazu passenden Gespräche.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 2. Dezember 2014 18:00
    Moderator

Alle Antworten

  • Hallo,
    ich verstehe glaube nicht so ganz, wie du was zusammen zählen willst.
    Ich gehe mal davon aus, dass du die Auswertung im Pro Monat haben willst. Für jeden Monat willst du dann heraus bekommen, wie viele Gespräche <30s, 20s<x<2min, 2min<x<10min usw. lang liefen. Das könnte in etwa mit folgendem Code funktionieren:

    var anzgespr = _bucs
        .GroupBy(b => new { Jahr = b.Von.Year, Monat = b.Von.Month })//Gruppierung nach Jahr und Monat
        .Select(x =>
            x.GroupBy(y => Category((y.Bis - y.Von).TotalSeconds))//Jeden Monat nach Gesprächslänge gruppieren
                .Select(y => new { Jahr = x.Key.Jahr, Monat = x.Key.Monat, Dauer = y.Key, Anzahl = y.Count() })//Jeweils nur die Anzahl mit Monat und Jahr zurück geben
                )
        .SelectMany(x => x)//Alle Unterlisten zu einer machen
        .ToList();
    Die Category-Methode erzeugt einen Key aus der Gesprächslänge:
    static int Category(double secs)
    {
        if (secs < 30)
            return 0;
        if (secs < 2 * 60)
            return 1;
        if (secs < 10 * 60)
            return 2;
        if (secs < 60 * 60)
            return 3;
        return 4;
    }
    Als Ergebnis erhältst du eine Liste mit den Eigenschaften Jahr und Monat sowie Dauer (Der Schlüssel der Category-Methode) und Anzahl der dazu passenden Gespräche.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 2. Dezember 2014 18:00
    Moderator
  • Hallo Tom,

    danke, ganau das wollte ich.

    Gruß

    Siegfried

    Dienstag, 2. Dezember 2014 20:50