查询mysql数据的水平布局

我有一个表(delvery_dates)与以下字段:

del_id,del_date,del_ProductID

我的正常查询生成

    2014-08-23 | 25
    2014-08-23 | 32
    2014-08-23 | 14
    2014-08-23 | 15
    2014-08-23 | 56
    2014-08-23 | 34
    2014-08-27 | 32
    2014-08-27 | 11
    2014-08-27 | 19
    2014-08-27 | 35

等等

我想要一个以下列格式输出的查询:

    del_date, del_ProductID-1, del_ProductID-2, del_ProductID-3, del_ProductID-4 .. up to 6
    2014-08-23    25                 32                14             15
    2014-08-27    32                 11                19             35

我见过有关数据透视表的地方,但我不明白!

任何帮助非常感谢

谢谢
克里斯

解决方法:

你需要的是一个Pivot查询.由于MySQL没有相关语句,因此您需要“手动”编写它(更确切地说,创建一个动态SQL表达式):

所以,它可能是这样的:

-- First you need to build the column list.
-- The "CASE ... END" expression will filter the data for each column
-- I use "max()" as an example; use whatever aggregate function you need.
select
  group_concat(distinct
    concat(
      'max(case when del_ProductID = ', del_productID, ' then del_id end) ',
      'as `del_productID-', del_productID, '` '
    )
  )
into @sql
from example;

-- Now build the full SELECT statement
set @sql = concat('SELECT del_date, ', @sql, ' from example group by del_date');


-- OPTIONAL: Check the SELECT statement you've just built
select @sql;

-- Prepare a statement using the SELECT statement built above
prepare stmt from @sql;
execute stmt;

-- When you are done, be sure to dealocate the prepared statement
deallocate prepare stmt;

see this example in SQL fiddle.

说明

你可能会说“伙计,这看起来相当复杂!”……但它并不复杂(这很费劲).那么,上述解决方案如何运作?

第一步是构建列列表和表达式来填充它.
group_concat()函数将获取行值(或表达式)并将它们连接起来,用逗号分隔它们.您需要一个聚合函数来显示数据透视表结果中的值.我选择max()作为示例,但您可以使用sum(),average()或任何其他聚合函数.

对于聚合函数内的case ... end片段,您需要透视表的每一列与del_productID的值匹配,因此,例如,当del_ProductID = 1时,如果del_ProductID为1,则del_id end将返回del_id的值(在任何其他情况下都将返回null,例如,如果要返回零,则可以添加else 0.

select ... into将表达式的结果存储到名为@sql的变量中.

在构建列列表之后,需要编写select语句的其余部分……这是使用concat()函数完成的.

至于其余部分,它非常简单:@sql是一个字符串,所以如果你想执行它,你需要使用它的值(这是一个select语句)创建一个预准备语句,并执行它.

上一篇:golang 快速排序


下一篇:快速排序