MSSQL Query | subselect, group by, sum....

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • MSSQL Query | subselect, group by, sum....

    Hallo Freunde,

    Ich habe eine MS-SQL Aufgabe zu lösen, vielleicht könnt ihr mir dabei helfen, es geht darum einen SELECT auszuführen, das Ergebnis daraus soll dann wieder eine Abfrage auf die gleiche Table machen usw. - Nun mache ich für mein "Endergebnis" momentan mehrere Abfragen und wollte mal sehen wer von euch hier eine "einfachere, klarere, schnellere" Lösung hat, denn die gibt es Zweifelsohne ....

    DB-SCHEMA:

    Tablename jobs

    AccountID | JobID | SuccessCt | JobStartDt | Resolution | SenderCSID | PageCt | RecipientCt | UserField2 | FailureCt |JobStartDt | JobCompleteDate
    x7-99-991 | 12345| 555 | 21.02.2012 | low | Some Text | 2 | 1114 | 1502 | 99 | 2012-01-01| 2012-01-01
    x7-99-991 | 99981| 655 | 21.02.2012 | low | Some Text | 1 | 1114 | 1502 | 99 | 2012-01-04| 2012-01-04
    x7-99-999 | 54321| 2585 | 21.02.2012 | low | Some Text | 2 | 1114 | 1577 | 99 | 2012-01-21| 2012-01-21
    x7-99-999 | 44452| 5591 | 21.02.2012 | low | Some Text | 4 | 1114 | 1577 | 99 | 2012-01-21| 2012-01-21
    x7-99-998 | 25252| 5155 | 21.02.2012 | low | Some Text | 2 | 1114 | 1974 | 99 | 2012-01-10| 2012-01-10

    So, so weit so schlimm :) - Ich mache momentan folgende Abfragen:

    Source Code

    1. SELECT JobId,SuccessCt,UserField2,FailureCt FROM [dbo].[Jobs] WHERE [AccountId] = 'x7-99-998' AND [JobStartDt] >= '$start' AND [JobCompleteDt] <= '$end' AND RecipientCt >= 5 AND SuccessCt != FailureCt ORDER BY [JobStartDt] ASC


    Hier erhalte ich dann die JobID für diese Kundennummer und diesen Zeitraum. Diese Daten speichere ich in ein Array:

    Source Code

    1. while($row = mssql_fetch_object($getJobs))
    2. {
    3. $t[$row->UserField2][] = $row->JobId;
    4. }


    Die nächste Abfrage lautet:

    Source Code

    1. SELECT JobStartDt, Resolution,SenderCSID,PageCt,RecipientCt,UserField2 FROM [dbo].[Jobs] WHERE JobId = '$value[0]'

    wobei $value["0"] von

    Source Code

    1. foreach($t as $key => $value)
    kommt.

    Aus dieser Abfrage erhalte ich die Einzeldaten für das jeweilige UserField2 - und die werden wieder in ein Array gepusht:

    Source Code

    1. $succCounter = mssql_fetch_assoc($query);
    2. echo $succCounter["successTotal"];
    3. $FSID = $key;
    4. $csid = $arg["SenderCSID"];
    5. $subject = utf8_decode($arg["SenderCSID"]);
    6. $PageCt = $arg["PageCt"];
    7. $RecipientCt = $arg["RecipientCt"];
    8. $pagesPerJob = $succCounter["successTotal"] * $arg["PageCt"];
    9. $jobstart = substr($arg["JobStartDt"],0,11);
    10. $jobIDs = implode(",", $value);
    11. array_push($jobArr,array("jobID" => $jobIDs,"subject" => $subject,"pageCt" => $PageCt,"RecipientCt" => $RecipientCt,"pagesPerJob" => $pagesPerJob,"successCt" => $succCounter['successTotal'],"SenderCSID" => $csid,"FSID" => $FSID,"jobstart" => $jobstart));
    Display All



    Nun habe ich folgendes erreicht:

    1. Ziehe mir alle JobID's zu einer Kundennummer innerhalb einer definierten Zeit.
    2. Suche mir alle JobID's aus Abfrage 1 zusammen welche das gleiche UserField2 haben und speichere mir diese JobID's in ein Array welches als KEY das UserField2 hat.
    3. Bastel aus Abfrage zwei ein array zusammen das summiert aus UserField2 die Werte für jobID,subject,pageCt,RecipientCt,pagesPerJob,successCt,SenderCSID,FSID,jobstart beinhaltet.

    was ich im Endeffekt benötige ist eben in einem Array zusammengefasst:
    jobID,subject,pageCt,RecipientCt,pagesPerJob,successCt,SenderCSID,FSID,jobstart die zum gleichen UserField2 gehören....


    (Wow, das beschreiben ist ehrlich schwer, hoffe man versteht es) .... :)

    Gruß,
    Matze
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Ich bin mir nicht ganz sicher was du genau erreichen möchtest. Wenn du für alle gleichen UserField2 eine Liste der JobIDs und die Summe der Counter haben möchtest, erreichst du das mit (gefunden bei [1]):

    Source Code

    1. SELECT TestOuter.UserField2, MAX((LEFT (Y.jobids, LEN (Y.jobids) -1))) AS JobIDs,
    2. sum(SuccessCt) SuccessCt, sum(FailureCt) FailureCt, sum(PageCt) PageCt
    3. FROM jobs AS TestOuter
    4. CROSS APPLY (
    5. SELECT x.jobids AS [text()]
    6. FROM (
    7. SELECT convert(varchar, JobID) + NCHAR(44) + SPACE(1) AS jobids
    8. FROM jobs AS Testinner
    9. WHERE TestOuter.UserField2 = TestInner.UserField2
    10. ) AS X
    11. FOR XML PATH ('')
    12. ) AS Y (jobids)
    13. GROUP BY UserField2
    Display All

    Was ich noch nicht verstehe, wie du die Datumsspalten zusammenfassen willst. Wenn diese für einen UserField2-Wert immer gleich sind (wie in deinem Beispiel), hängst du an das SELECT noch MIN(JobStartDt) JobStartDt dran.

    Thomas

    [1] entwickler-forum.de/showthread.php?t=55834