2016-03-19 3 views
2

Ich bin für eine Art und Weise Gruppe suchen empNumber zusammen und kann nicht scheinen, einen WegGROUP BY, nachdem Sie das Ergebnis von PIVOT bekommen

Dies ist meine aktuelle Abfrage zu finden:

SELECT EmpNumber, [Match], [NonMatch], [Base], [SRA], [SRS] 

from 

(select a.empnumber, TT_GB.MAXDate, a.TT_Plan, a.TT_Ratio 
from table_1 as a 

inner join 

(select b.empnumber, b.TT_Plan, MAX(b.TT_Date) as MAXDate 
from table_1 as b 
group by b.empnumber, b.TT_Plan) TT_GB 

ON a.EmpNumber = TT_GB.EmpNumber AND a.TT_Plan = TT_GB.TT_Plan AND a.TT_Date = TT_GB.MAXDate 
) M 

PIVOT 
(
     SUM(TT_Ratio) 
     FOR [TT_Plan] IN ([Match], [NonMatch], [Base], [SRA], [SRS]) 
) P 

Dies ist was ich in der Tabelle

============================================= 
EmpNumber TT_Plan  TT_Date  TT_Ratio 
1   Base  2008-05-11 11 
1   Base  2015-08-22 12 
1   Base  2010-07-09 13 
1   Match  2003-01-23 15 
1   Match  2000-11-17 14 
1   NonMatch 2014-09-22 19 
1   NonMatch 2015-02-15 18 
1   NonMatch 2009-08-13 17 
1   SRA   2005-07-16 2 
1   SRS   2006-04-12 3 
2   Base  2008-08-08 5 
2   Base  2009-09-09 7 
2   Base  2010-10-10 4 
2   NonMatch 2011-01-01 8 
2   NonMatch 2012-12-12 6 
2   NonMatch 2007-07-07 9 

Desired output 
============== 
EmpNumber Match NonMatch Base  SRA SRS 
1   15  18   12   2  3 
2   0   6   4   0  0 

haben Aber was ich jetzt habe, ist das, und alles, was ich tun Gruppe wie oben

von EmpNumber wollen
+0

Wie ich weiß, hat MySql nicht PIVOT Klausel unterstützen, habe ich die Dokumentation der geprüft neueste Version 5.7: http://dev.mysql.com/doc/refman/5.7/en/select.html Sie haben wahrscheinlich ein falsches Tag verwendet. – krokodilko

+0

Hallo ThanksThis MS SQL, so ist Pivot OK – Matt

+0

Bearbeiten Sie Ihre Frage und liefern Beispieldaten und gewünschte Ergebnisse. Diese sind in der Frage angemessen, kein Kommentar. –

Antwort

1

Ich glaube nicht, dass dies die beste Lösung ist, aber Sie können es tun, indem Sie eine Alias-Tabelle wie folgt zu erstellen:

Select t.EmpNumber, Sum(t.Match), Sum(t.NonMatch), Sum(t.Base), Sum(t.SRA), Sum(t.SRS) from 
(
SELECT EmpNumber, [Match], [NonMatch], [Base], [SRA], [SRS] 

from 

(select a.empnumber, TT_GB.MAXDate, a.TT_Plan, a.TT_Ratio 
from table_1 as a 

inner join 

(select b.empnumber, b.TT_Plan, MAX(b.TT_Date) as MAXDate 
from table_1 as b 
group by b.empnumber, b.TT_Plan) TT_GB 

ON a.EmpNumber = TT_GB.EmpNumber AND a.TT_Plan = TT_GB.TT_Plan AND a.TT_Date = TT_GB.MAXDate 
) M 

PIVOT 
(
     SUM(TT_Ratio) 
     FOR [TT_Plan] IN ([Match], [NonMatch], [Base], [SRA], [SRS]) 
) P 
) t group by t.EmpNumber 
+0

Danke, dass funktioniert – Matt

1

So, wie ich vor

schrieb
declare @table_1 table (EmpNumber int, TT_Plan varchar(20), TT_Date date, TT_Ratio int) 
insert @table_1 
values 
(1,'Base','2008-05-11',11) 
,(1,'Base','2015-08-22',12) 
,(1,'Base','2010-07-09',13) 
,(1,'Match','2003-01-23',15) 
,(1,'Match','2000-11-17',14) 
,(1,'NonMatch','2014-09-22',19) 
,(1,'NonMatch','2015-02-15',18) 
,(1,'NonMatch','2009-08-13',17) 
,(1,'SRA','2005-07-16',2) 
,(1,'SRS','2006-04-12',3) 
,(2,'Base','2008-08-08',5) 
,(2,'Base','2009-09-09',7) 
,(2,'Base','2010-10-10',4) 
,(2,'NonMatch','2011-01-01',8) 
,(2,'NonMatch','2012-12-12',6) 
,(2,'NonMatch','2007-07-07',9) 

SELECT EmpNumber, [Match], [NonMatch], [Base], [SRA], [SRS] 

from 

(select a.empnumber,a.TT_Plan, a.TT_Ratio 
from @table_1 as a 

inner join 

(select b.empnumber, b.TT_Plan, MAX(b.TT_Date) as MAXDate 
from @table_1 as b 
group by b.empnumber, b.TT_Plan) TT_GB 

ON a.EmpNumber = TT_GB.EmpNumber AND a.TT_Plan = TT_GB.TT_Plan AND a.TT_Date = TT_GB.MAXDate 
) M 

PIVOT 
(
     SUM(TT_Ratio) 
     FOR [TT_Plan] IN ([Match], [NonMatch], [Base], [SRA], [SRS]) 
) P 

und Ergebnis ist

EmpNumber Match  NonMatch Base  SRA   SRS 
----------- ----------- ----------- ----------- ----------- ----------- 
1   15   18   12   2   3 
2   NULL  6   4   NULL  NULL 
1

Sie können Fensterfunktionen verwenden, um zuerst den neuesten Datensatz pro Gruppe zu filtern.

Die Arbeits Abfrage wird dann:

select * 
from (
    select empnumber, tt_plan, tt_ratio 
    from (
      select *, 
        rank() over (partition by empnumber, tt_plan 
           order by tt_date desc) as rnk 
      from  table_1) as t1 
    where rnk = 1) as m 
pivot (
     sum(TT_Ratio) 
     for TT_Plan in ([Match], [NonMatch], [Base], [SRA], [SRS]) 
) as p 

SQL fiddle

Ausgang:

+-----------+--------+----------+------+--------+--------+ 
| empnumber | Match | NonMatch | Base | SRA | SRS | 
+-----------+--------+----------+------+--------+--------+ 
| 1  | 15 | 18 | 12 | 2 | 3 | 
| 2  | (null) |  6 | 4 | (null) | (null) | 
+-----------+--------+----------+------+--------+--------+ 
+0

Wow, danke so viel jeder für die Hilfe ... Ich werde versuchen sie alle ... gewesen den ganzen Tag damit kämpfen! – Matt

+0

Ich benutze diese rank() Funktion nie zuvor, probiere es einfach aus und es funktioniert! danke – Matt

+0

Es hilft großartig für bessere Leistung. Im Gegensatz zu anderen Lösungen benötigt es keinen 'Join'. Oh, und wenn es dir gefällt, wäre es nett, eine positive Bewertung zu bekommen ;-) – trincot