2017-09-26 3 views
0

ich eine Datenbanktabelle haben (return_period) mit AufzeichnungenMySql-Pivot-Tabelle

id ReturnPeriod Value Date 
1 10    10X  11/1/2012 
2 20    20x  11/1/2012 
3 30    30x  11/1/2012 
4 10    10xx 12/1/2013 
5 20    20xx 12/1/2013 
6 30    30y  1/1/2015 
7 30    303  1/1/2015 

und erwartete Tabelle einen Ausgang wie unten:

Date  Rp10_Value Rp20_Value Rp30_Value 
11/1/2012 10x   20x   30x 
12/1/2013 10XX   20XX 
1/1/2015        30y 
1/1/2015        303 

I Aufzeichnungen wollen auf der Grundlage der Termine (wollen die mehrere Aufzeichnungen). Gibt es eine Möglichkeit, ich kann eine Anfrage auf diese Art von Anforderung schreiben.Dank

+2

reinen Code-Schreibanforderungen sind Wegthema auf Stack-Überlauf - wir Fragen hier beziehen sich auf * * spezifische Programmierprobleme erwarten - aber wir werden Ihnen gerne helfen, es selbst zu schreiben! Sagen Sie uns [was Sie versucht haben] (https://stackoverflow.com/help/how-to-ask), und wo Sie stecken bleiben. Dies wird uns auch helfen, Ihre Frage besser zu beantworten. – glennsl

Antwort

0

Dies ist ein Drehpunkt. In MySQL können Sie bedingte Aggregation verwenden:

select rp.date, 
     max(case when returnperiod = 10 then value end) as rp10_value, 
     . . . 
from return_period rp 
group by rp.date; 

EDIT:

Ich sehe, Sie Duplikate haben. Die gleiche Idee gilt, aber man braucht eine Sequenznummer enthalten:

select rp.date, 
     max(case when returnperiod = 10 then value end) as rp10_value, 
     . . . 
from (select rp.*, 
      row_number() over (partition by date, returnperiod order by date) as seqnum 
     from return_period rp 
    ) rp 
group by rp.date, seqnum; 
+0

Vielen Dank für die Hilfe, aber ich bin nicht auf den maximalen Wert ausgerichtet. Ich möchte alle Werte. –

+0

@srividyabommineni. . . Leicht in Ihrer Frage verpasst. Dies wird auch leicht mit Fensterfunktionen gehandhabt. –

0
select date, 
case when rp=10 then value else null end as Rp10_Value, 
case when rp=10 then value else null end as Rp20_Value, 
case when rp=10 then value else null end as Rp30_Value 

from 
(
SELECT date, value, ReturnPeriod 
FROM Table2 where ReturnPeriod=10 
union all 
SELECT date, value, ReturnPeriod 
FROM Table2 where ReturnPeriod=20 
union all 
SELECT date, value, ReturnPeriod 
FROM Table2 where ReturnPeriod=30 
) ; 
+0

es scheint mir alle Werte zu bekommen, aber der Tisch etwas, was wie folgt aussieht: –

+0

es alle Werte für mich zu bekommen scheint, aber die Tabelle einige etwas wie dieses \t Datum sieht \t Rp10_Value \t Rp20_Value \t Rp30_Value \t 01.11/2012 \t 10x \t null \t null \t 11/1/2012 \t 10XX \t null \t null \t 11/1/2012 \t null \t 20x \t null \t 12/1/2013 \t null \t 20xx \t null \t 1/1/2015 \t null \t null \t 30Y \t 1/1/2015 \t null \t null \t 303 –