【问题标题】:Geting the columns as rows from a single table in mysql [duplicate]从mysql中的单个表中获取列作为行[重复]
【发布时间】:2015-03-21 01:35:18
【问题描述】:

我有一张像下面这样的表,我需要将subject 行作为列,将attendance 作为行

sid name    subject attendance
1   jhon    sub1    1
2   toni    sub1    0
3   danial  sub1    1
4   jafer   sub1    1
5   jhon    sub2    1
6   toni    sub2    1
7   danial  sub2    1
8   jafer   sub2    0

根据我的要求,我需要得到如下表的输出:

name    sub1    sub2
jhon    1       1
toni    0       1
danial  1       1
jafer   1       0

我是在 mysql 中编写查询的新手。 提前感谢您的帮助!

【问题讨论】:

  • 你用什么语言玩它? PHP?
  • 这些科目中有多少是可能的?只有2个吗?
  • 在主题中假设它是一个动态的主题,我在编写查询之前不知道主题。它可能是 2 个主题或更多主题,这取决于部门,我不知道主题名称每次都会有所不同跨度>
  • 我已经明确指定了这个问题的主题。我需要在“MYSQL”中编写查询

标签: mysql pivot


【解决方案1】:

您可以使用以下技术来实现这一点,请注意,它仅在您知道您的案例的总变化时才有效,它只是 sub1sub2 ,如果还有更多您需要在查询中添加它们或生成完整的动态查询

select 
name,
max(case when subject='sub1' then attendance end ) as 'sub1',
max(case when subject='sub2' then attendance end ) as 'sub2'
from test 
group by name

DEMO

为了让它变得有点复杂,请在 google 上搜索 mysql 动态旋转,你会得到一些教程来了解它是如何工作的。

对于你的情况,你可以像下面这样 -

set @d_sql = null;
select
  group_concat(distinct
    concat(
      'max(case when subject = ''',
      subject,
      ''' then attendance else null end) as ',
      concat('`',subject, '`')
    )
  ) into @d_sql
from test;

set @d_sql = concat('SELECT  name,', @d_sql, ' from test group by name');

PREPARE stmt from @d_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

DEMO

【讨论】:

  • 请假设主题名称是动态的,我们在编写查询之前不知道主题名称,谢谢
猜你喜欢
  • 1970-01-01
  • 2018-08-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2018-06-04
  • 2014-07-18
  • 1970-01-01
相关资源
最近更新 更多