我有一个表(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语句)创建一个预准备语句,并执行它.