Announcement

Collapse
No announcement yet.

Zusammenfassen von 2 Datensätzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zusammenfassen von 2 Datensätzen

    Hallo

    Ich habe folgendes Problem:

    Ich muss mehrere Datensätze die aus einer Abfrage resultieren zusammenfassen und zwar wie folgt:

    ID | Betreff | Grund
    ----------------------
    1 | Test1 | Grund1
    1 | Test1 | Grund2
    2 | Test2 | Grund1

    Soll nun so zusammengefasst werden:

    ID | Betreff | Grund
    ----------------------
    1 | Test1 | Grund1, Grund2
    2 | Test2 | Grund1

    Ich habe in diesem Forum schon einige Lösungsansätze gefunden, die meisten erfordern jedoch, dass Grund eine Spalte in der Tabelle benötigt. Hier ist Grund jedoch nur im Select wie folgt deklariert: 'Grund1' as Grund


    Hier noch die bisherige Abfrage.
    Die Abfrage wird später in SAP Business One als Alarm eingefügt, daher gibt ist sie relativ vollgestopft.
    Spoiler:
    Code:
    /* Abfrage Seit X Tagen nicht geändert */
    SELECT T0.[callID] as TicketNr, T0.[subject] as Betreff, T0.[custmrName] as Kunde,T1.[U_NAME] as Bearbeiter, T0.[priority] as Priorität, 'Seit mehreren Tagen nicht geändert' as Grund
    FROM OSCL T0
    INNER JOIN OUSR T1 ON T0.[assignee] = T1.[USERID]
    WHERE (T0.[priority] = 'L' AND DATEDIFF(DAY, T0.[updateDate], GetDate()) - DATEDIFF(wk, T0.[updateDate], GetDate()) % 7 * 2 > @sxtng_Dauer_L) AND T0.[assignee] = @Benutzer AND T0.[status] != '-1'
    OR (T0.[priority] = 'M' AND DATEDIFF(DAY, T0.[updateDate], GetDate()) - DATEDIFF(wk, T0.[updateDate], GetDate()) % 7 * 2 > @sxtng_Dauer_M) AND T0.[assignee] = @Benutzer AND T0.[status] != '-1'
    OR (T0.[priority] = 'H' AND DATEDIFF(DAY, T0.[updateDate], GetDate()) - DATEDIFF(wk, T0.[updateDate], GetDate()) % 7 * 2 > @sxtng_Dauer_H) AND T0.[assignee] = @Benutzer AND T0.[status] != '-1'
    
    
    UNION ALL /* Zusammenfügen */
    
    /* Beginn der Arbeit */
    SELECT T0.[callID] as TicketNr, T0.[subject] as Betreff, T0.[custmrName] as Kunde, T1.[U_NAME] as Bearbeiter , T0.[priority] as Priorität, 'Arbeit noch nicht begonnen' as Grund
    FROM OSCL T0
    INNER JOIN OUSR T1 ON T0.[assignee] = T1.[USERID]
    WHERE (T0.[priority] = 'L' AND T0.[status] = '-3' AND DATEDIFF(DAY, T0.[createDate], GetDate()) - DATEDIFF(wk, T0.[createDate], GetDate()) % 7 * 2 > @bda_Dauer_L) AND T0.[assignee] = @Benutzer
    OR    (T0.[priority] = 'M' AND T0.[status] = '-3' AND DATEDIFF(DAY, T0.[createDate], GetDate()) - DATEDIFF(wk, T0.[createDate], GetDate()) % 7 * 2 > @bda_Dauer_M) AND T0.[assignee] = @Benutzer
    OR    (T0.[priority] = 'H' AND T0.[status] = '-3' AND DATEDIFF(DAY, T0.[createDate], GetDate()) - DATEDIFF(wk, T0.[createDate], GetDate()) % 7 * 2 > @bda_Dauer_H) AND T0.[assignee] = @Benutzer
    
    
    UNION ALL /* Zusammenfügen */
    
    /* Nächster Kontakt Heute oder Überfällig */
    SELECT T0.[callID] as TicketNr, T0.[subject] as Betreff, T0.[custmrName] as Kunde,T1.[U_NAME] as Bearbeiter, T0.[priority] as Priorität, 'Kontakt heute oder überfällig' as Grund
    FROM OSCL T0
    INNER JOIN OUSR T1 ON T0.[assignee] = T1.[USERID]
    WHERE (T0.U_nContact <= GetDate()) AND T0.[assignee] = @Benutzer AND T0.[status] != '-1'
    
    
    UNION ALL /* Zusammenfügen */
    
    /* Lösung ist überfällig */
    SELECT T0.[callID] as TicketNr, T0.[subject] as Betreff, T0.[custmrName] as Kunde, T1.[U_NAME] as Bearbeiter, T0.[priority] as Priorität, 'Lösung überfällig' as Grund
    FROM OSCL T0
    INNER JOIN OUSR T1 ON T0.[assignee] = T1.[USERID]
    WHERE (T0.[priority] = 'L' AND DATEDIFF(Day, T0.createDate, GetDate()) - DATEDIFF(wk, T0.[createDate], GetDate()) % 7 * 2 > @liu_Dauer_L) AND T0.[assignee] = @Benutzer AND T0.[status] != '-1'
    OR	  (T0.[priority] = 'M' AND DATEDIFF(Day, T0.createDate, GetDate()) - DATEDIFF(wk, T0.[createDate], GetDate()) % 7 * 2 > @liu_Dauer_M) AND T0.[assignee] = @Benutzer AND T0.[status] != '-1'
    OR	  (T0.[priority] = 'H' AND DATEDIFF(Day, T0.createDate, GetDate()) - DATEDIFF(wk, T0.[createDate], GetDate()) % 7 * 2 > @liu_Dauer_H) AND T0.[assignee] = @Benutzer AND T0.[status] != '-1'
    ORDER BY T0.[callID]



    Ich weiss da leider nicht mehr weiter und habe auch nicht die allzu grössten SQL Kenntnisse, darum wäre ich für einen kleinen Anstoss dankbar
    Achja das Ganze ist MSSQL/TSQL

    Danke und Gruss
    voege11

  • #2
    Ich habe in diesem Forum schon einige Lösungsansätze gefunden, die meisten erfordern jedoch, dass Grund eine Spalte in der Tabelle benötigt. Hier ist Grund jedoch nur im Select wie folgt deklariert: 'Grund1' as Grund
    Welche hast du gefunden (bitte hier angeben) und warum ist die jeweilige Lösung nicht geeignet? Hat ja keinen Sinn, wenn sich jemand den Kopf zerbricht und du dann diese Lösung wieder nicht verwenden kannst/willst.

    bye,
    Helmut

    PS: hast du das hier auch gelesen und wenn ja, warum passt das nicht?

    Comment


    • #3
      Nein das hatte ich noch nicht gelesen.
      Aber ist das Problem nicht das gleiche was ich oben erwähnt hatte?

      Brauche ich für diesen Teil der Prozedur:
      Code:
      select @orte = IsNull(@orte + ', ','') + ort from t2
      nicht das Feld "Grund" (in meinem Fall) als existierende Spalte in einer Tabelle?
      Ich erstelle diese Spalte ja nur in der Abfrage per
      Code:
      SELECT 'Testgrund' as Grund
      Oder habe ich dort was falsch verstanden?

      EDIT: Kleine Zwischenfrage: Es gibt doch bestimmt eine bessere Lösung als die verschiedenen Abfragen zu vereinen als mit UNION ALL oder? Weiss da evtl. jemand was?
      Zuletzt editiert von voege11; 23.06.2011, 14:41.

      Comment


      • #4
        Aha, jetzt habe ich es kapiert. Ich würde hier das Ganze zerlegt in einer stored procedure abhandeln, die kann dann auch das Resultat deiner ersten Abfrage als temporäre Tabelle speichern und damit dann den zweiten Teil erledigen. Alles in einer einzigen Query unterzubringen wird etwas komplex und übersteigt hier den mir zur Verfügung stehenden Zeitrahmen leider ein wenig.

        bye,
        Helmut

        Comment


        • #5
          Danke schonmal für die Antwort!
          Dass heisst eigentlich es wäre sinnvoller jeden dieser "Blöcke" zwischen den UNION ALL in eine Stored Procedure packen und diese dann mit einer Query aufrufen?

          Leider habe ich auch keine Ahnung wie ich das mit einer temporären Tabelle lösen kann (Mein Problem mit dem Zusammenfassen). Gibt es da evtl. noch einen Link der das ganze etwas erläutert bzw. ein Beispiel zeigt?

          Comment


          • #6
            Nein, eigentlich meinte ich eine einzige stored proc, in der zuerst eine Hilfstabelle angelegt wird und diese wird dann schrittweise duch die einzelnen selects, die jetzt noch mit einem union verbunden sind, befüllt. Macht das ganze weder einfacher noch performanter aber wahrscheinlich leichter les- und wartbar. Sollte man das Ergebnis, das ja immerhin ein Resultset ist, direkt in einem weiteren select weiterverwenden wollen, müsste man das Ganze mit einer table-valued UDF machen.

            bye,
            Helmut

            Comment

            Working...
            X