首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql数据水平布局的查询

mysql数据水平布局的查询
EN

Stack Overflow用户
提问于 2014-08-20 14:10:28
回答 1查看 378关注 0票数 0

我有一个包含以下字段的表(delvery_dates):

del_id,del_date,del_ProductID

我的正常查询生成

代码语言:javascript
复制
    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

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

代码语言:javascript
复制
    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

我在某个地方见过枢轴桌,但我不明白!

任何帮助都很感激

谢谢克里斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-20 14:28:28

您需要的是一个数据透视查询。由于MySQL没有这方面的语句,所以需要“手动”编写它(更确切地说,创建一个动态的SQL表达式):

所以,可能是这样的:

代码语言:javascript
复制
-- 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语句)创建一个准备好的语句,并执行它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25406950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档