我有一个包含以下字段的表(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我在某个地方见过枢轴桌,但我不明白!
任何帮助都很感激
谢谢克里斯
发布于 2014-08-20 14:28:28
您需要的是一个数据透视查询。由于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;请请参阅本例中的SQL花式。。
解释
你可能会说:“伙计,这看起来很复杂!”但它一点也不复杂(只是很辛苦)。那么,上面的解决方案是如何工作的呢?
第一步是构建列列表和一个表达式来填充它。group_concat()函数将接受行值(或表达式)并将它们连接起来,用逗号分隔它们。您需要一个聚合函数来显示数据透视表结果中的值。我选择max()作为示例,但您可以使用sum()、average()或任何其他聚合函数。
至于聚合函数中的case ... end部分,您需要支点表的每一列都与del_productID的值匹配,因此,例如,只有当del_ProductID为1时,case when del_ProductID = 1 then del_id end才会返回del_id的值(在任何其他情况下都会返回null,例如,如果希望返回零,则可以添加else 0 )。
select ... into将把表达式的结果存储到一个名为@sql的变量中。
在构建了列列表之后,需要编写select语句的其余部分.这是用concat()函数完成的。
至于其余的,它是非常直接的:@sql是一个字符串,所以如果您想要执行它,您需要使用它的值(这是一个select语句)创建一个准备好的语句,并执行它。
https://stackoverflow.com/questions/25406950
复制相似问题