2017-08-29 1 views
0

Ich erstelle eine Abfrage, die Gruppen Statusdaten des Mitglied Datensätze in einer Zeile in folgendem Format:Ärger mit Aggregaten und Gruppierung in SQL Server

 MemberID P1StatusDate P2StatusDate P3StatusDate P4StatusDate 
     10  NULL    NULL   NULL   08/20/2017 

In diesem speziellen Fall die ersten drei Zustände null sind, aber sie können bevölkert sein. Ich habe dies mit der folgenden Abfrage:

select memberid, max(case when statustype = 'Applicant' then cast(B.statusdate as date)end) as P1StatusDate 
    max(case when B.statustype = 'Pending' then cast(B.statusdate as date)end) as P2StatusDate 
    max(case when B.statustype = 'In Progess' then cast(sh.statusdate as date)end) as P3StatusDate 
    max(case when B.statustype = 'Approved' then cast(B.statusdate as date)end) as P4StatusDate 
    from Table A 
    inner join B 
    on A.statusdate = B.statusdate 
    group by memberid 

Das Problem, das ich gefunden habe, ist, dass, wenn ein Mitglied hat 2 Genehmigten Datensätze mit unterschiedlichen Terminen nur eine als P4StatusDate auftaucht. Zum Beispiel:

MemberID Status StatusDate 
    10   Approved 08/19/2017 
    10   Approved 08/20/2017 

Dies erscheint als:

 MemberID P1StatusDate P2StatusDate P3StatusDate P4StatusDate 
     10   Null   Null    Null   08/20/2017 

Die 2017.08.19 Datensatz wird weggelassen.

Wenn ich die Abfrage ändern, um das Statusdatum in der Gruppe zu enthalten, füllt es beide Datensätze für dieses Mitglied korrekt.

MemberID P1StatusDate P2StatusDate P3StatusDate P4StatusDate 
    10   Null   Null   Null   08/19/2017 
    10   Null   Null   Null   08/20/2017 

Dies wird jedoch auch dazu führen, jede statusdate Aufzeichnung auf einer anderen Leitung für die anderen Mitglieder erscheinen:

MemberID P1StatusDate P2StatusDate P3StatusDate P4StatusDate 
    15   01/01/2017 NULL   NULL   NULL 
    15      03/01/2017  NULL   NULL 
    15   NULL   NULL   04/01/2017 NULL 
    15   NULL   NULL   NULL   05/01/2017 

Gibt es eine Möglichkeit, die Gruppierung zu halten, so dass alle Statusdaten auf gruppiert eine Zeile, aber führt auch Aufzeichnungen, wo es mehrere Datensätze mit dem gleichen Status wie oben angegeben gibt?

Antwort

0

Aggregat über eine aggregierten abgeleitete Tabelle

select memberid, max(p1date), max(p2date), max(p3date), max(p4date) 
from (
select ..... -- your raw grouping with nulls 
from table 
group by ... 
) x 
group x.memberid 
0

Von SQL-Abfrage

WITH t_status AS 
(
SELECT memberid, [status], 
     CASE WHEN [status] = 'Applicant' THEN statusdate ELSE NULL END P1StatusDate, 
     CASE WHEN [status] = 'Pending' THEN statusdate ELSE NULL END P2StatusDate, 
     CASE WHEN [status] = 'In Progress' THEN statusdate ELSE NULL END P3StatusDate, 
     CASE WHEN [status] = 'Approved' THEN statusdate ELSE NULL END P4StatusDate, 
     ROW_NUMBER() OVER (PARTITION BY memberid, [status] ORDER BY statusdate) rnum 
    FROM t_member_status -- your table name 
) 

SELECT memberid, 
     MAX(P1StatusDate) P1StatusDate, 
     MAX(P2StatusDate) P2StatusDate, 
     MAX(P3StatusDate) P3StatusDate, 
     MAX(P4StatusDate) P4StatusDate 
    FROM t_status 
GROUP BY memberid, rnum 
ORDER BY memberid, rnum 

Ergebnis (zugegeben ein Beispieldatum 20 MemberID mit anderen Werten von Status andere Aufzeichnungen zu simulieren und mit dem gleichen Status auch für die gleiche Mitglied-ID)

memberid P1StatusDate P2StatusDate P3StatusDate P4StatusDate 
10   NULL   NULL   NULL   2017-08-19 
10   NULL   NULL   NULL   2017-08-20 
15   2017-01-01  2017-03-01  2017-04-01  2017-05-01 
20   2017-01-01  2017-03-01  2017-04-01  2017-05-01 
20   NULL   NULL   NULL   2017-05-02 
+0

Hinzufügen der Aggregat-Abfrage hat nicht geholfen. Bei Auswahl von Max (P4StatusDate) wurde immer noch eines der beiden Datumsangaben für dasselbe Element entfernt. Um dies zu lösen, musste ich ein zusätzliches Feld für die Gruppierung hinzufügen, das die beiden Datensätze weiter differenzierte. – jackstraw22

+0

Ich habe die Abfrage bearbeitet. Dies kann für die Beispieldaten ausreichen, die Sie zur Verfügung gestellt haben. –

+0

Das CTE funktioniert besser, aber die Ergebnisse sind noch ein wenig aus. Es gibt eine Zeile aller NULL, dann eine Zeile mit 2017-08-19 für P4, dann eine weitere NULL-Zeile und dann eine Zeile mit 2017-08-20. – jackstraw22