Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql数据透视表日期(垂直到水平数据)_Mysql_Sql_Pivot - Fatal编程技术网

mysql数据透视表日期(垂直到水平数据)

mysql数据透视表日期(垂直到水平数据),mysql,sql,pivot,Mysql,Sql,Pivot,我已经找了好几个小时没有一个像样的答案我要转换此表: Client_id Date ----------- ------------ 1 2013-02-03 1 2013-02-10 1 2013-05-12 2 2013-02-03 2 2013-07-15 致: 为了得到这个结果,您需要透视数据。MySQL没有pivot函数,但您可以将聚合函数与CASE表达

我已经找了好几个小时没有一个像样的答案

我要转换此表:


Client_id    Date
-----------  ------------  
1            2013-02-03    
1            2013-02-10
1            2013-05-12
2            2013-02-03
2            2013-07-15
致:


为了得到这个结果,您需要透视数据。MySQL没有pivot函数,但您可以将聚合函数与
CASE
表达式一起使用

如果已知日期数,则可以硬编码查询:

select client_id,
  max(case when rownum = 1 then date end) Date1,
  max(case when rownum = 2 then date end) Date2,
  max(case when rownum = 3 then date end) Date3
from
(
  select client_id,
    date,
    @row:=if(@prev=client_id, @row,0) + 1 as rownum,
    @prev:=client_id 
  from yourtable, (SELECT @row:=0, @prev:=null) r
  order by client_id, date
) s
group by client_id
order by client_id, date

我实现了用户变量,为
client\u id
组中的每条记录分配一个行号

如果日期数目未知,则需要使用准备好的语句动态创建sql:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN rownum = ',
      rownum,
      ' THEN date END) AS Date_',
      rownum
    )
  ) INTO @sql
from
(
  select client_id,
    date,
    @row:=if(@prev=client_id, @row,0) + 1 as rownum,
    @prev:=client_id 
  from yourtable, (SELECT @row:=0) r
  order by client_id, date
) s
order by client_id, date;


SET @sql 
  = CONCAT('SELECT client_id, ', @sql, ' 
           from
           (
             select client_id,
               date,
               @row:=if(@prev=client_id, @row,0) + 1 as rownum,
               @prev:=client_id 
             from yourtable, (SELECT @row:=0) r
             order by client_id, date
           ) s
           group by client_id
           order by client_id, date');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

它们都给出了结果:

| CLIENT_ID |                          DATE_1 |                          DATE_2 |                     DATE_3 |
--------------------------------------------------------------------------------------------------------------
|         1 | February, 03 2013 00:00:00+0000 | February, 10 2013 00:00:00+0000 | May, 12 2013 00:00:00+0000 |
|         2 | February, 03 2013 00:00:00+0000 |     July, 15 2013 00:00:00+0000 |                     (null) |

你知道最大日期数吗,还是无限期?如果你知道这个数字,你可以用纯SQL来实现。如果没有,您将需要使用动态sql。数据显示问题通常最好在应用程序级别处理,例如使用一点PHP。否则,只需将显示器旋转90度;-)基本上最多5个日期。可能重复的可能重复的u值得+100从我:),u genius in sql:)@向导您必须能够告诉聚合将什么日期转换到列中,这就是为什么
行号
如此重要。否则,它将不知道在每个选项中选择哪一个column@bluefeet工作出色!非常感谢!在哪里我可以学到更多关于复杂sql的知识?wizard我很高兴它能为您工作。我在这个网站上通过回答和复习问题来学习。对于这么多不同的东西来说,这是一个很好的资源。@顺便说一句,欢迎使用堆栈溢出。如果您不确定事情是如何进行的,如果您发现问题的任何答案都有帮助,请务必通过左边的复选标记接受答案。这将有助于网站的未来访问者,您可以获得网站代表的认可。:)
| CLIENT_ID |                          DATE_1 |                          DATE_2 |                     DATE_3 |
--------------------------------------------------------------------------------------------------------------
|         1 | February, 03 2013 00:00:00+0000 | February, 10 2013 00:00:00+0000 | May, 12 2013 00:00:00+0000 |
|         2 | February, 03 2013 00:00:00+0000 |     July, 15 2013 00:00:00+0000 |                     (null) |