2017-09-26 150 views
0

我有一个数据库表(return_period),具有记录的MySQL数据透视表

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 

,并预期输出表如下图所示:

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 

我想根据日期记录(要多记录)。是否有办法我可以写这种类型的要求查询。谢谢

+2

纯代码编写请求是题外话堆栈溢出 - 我们期望在这里 问题涉及到具体* *编程问题 - 但我们 会很高兴帮助你自己写!告诉我们 [你试过的东西](https://stackoverflow.com/help/how-to-ask),以及你卡在哪里。 这也将帮助我们更好地回答你的问题。 – glennsl

回答

0

这是一个关键。在MySQL中,你可以使用条件汇总:

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

编辑:

我看你有没有重复。同样的概念适用,但你需要包含序列号:

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

谢谢你的帮助,但我不是瞄准最大价值。我想要所有的价值。 –

+0

@srividyabommineni。 。 。很容易错过你的问题。这也很容易使用窗口函数来处理。 –

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

似乎得到了我所有的值,但该表看起来像这样一些事情: –

+0

它似乎得到了我所有的值,但该表看起来有些这样的事\t日期\t Rp10_Value \t Rp20_Value \t Rp30_Value \t 11/1/2012 \t \t 10倍空\t空 \t \t 2012年11月1日10XX \t \t空空 \t \t 2012年11月1日空\t \t 20倍空 \t \t 2013年12月1日空\t 20XX \t空 \t 1/1/2015 \t空\t空\t 30Y \t 1/1/2015 \t空\t空\t 303 –