【问题标题】:Reforming table structure of columns possible?可以改革列的表结构吗?
【发布时间】:2012-10-12 06:33:37
【问题描述】:

我整天都在忙这个。我玩过很多 MySQL 代码,我要么无能,要么不擅长编码..

我有一张桌子

name     id       type      amount
=================================
apple    21       cars      67
apple    21       bikes     85
apple    21       skates    557
apple    21       pajs      56
orange   34       bikes     345
orange   34       disks     678
orange   34       cars      234
orange   34       pajs      5678

我想写一个查询,以这种形式带回表格

name    id cars bikes skates pajas disks
=========================================
apple   21 67   85    557    56    0    
orange  34 234  345   0      5678  678

我真的不知道从哪里开始。对不起,如果这是一个菜鸟问题,但 MySQL 有时真的很难概念化。

【问题讨论】:

标签: mysql sql join pivot-table


【解决方案1】:

尝试使用PreparedStatement

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(ID),MAX(case when type = ''',
      type,
      ''' then amount ELSE NULL end) AS ',
       type
    )
  ) INTO @sql
FROM table1;

SET @sql = CONCAT('SELECT name, ', @sql, ' 
                   FROM table1 GROUP BY name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQLFiddle Demo

或者,

SELECT  name,
        MAX(ID) ID,
        MAX(case when type = 'cars' THEN amount ELSE NULL end) AS cars,
        MAX(case when type = 'bikes' THEN amount ELSE NULL end) AS bikes,
        MAX(case when type = 'skates' THEN amount ELSE NULL end) AS skates,
        MAX(case when type = 'pajas' THEN amount ELSE NULL end) AS pajas,
        MAX(case when type = 'disks' THEN amount ELSE NULL end) AS disks
FROM table1 
GROUP BY name;

SQLFiddle Demo

【讨论】:

  • John Woo 这是您第二次帮助我解决闪电般的代码完美运行。我什至不知道该说什么。非常感谢。
  • 绝对完美。像你这样的程序员是我向往的。
  • 嗨,约翰,我可以问你一个问题吗?查询效果很好。但是当我在这里尝试时它不起作用?表结构没问题。难道我做错了什么? sqlfiddle.com/#!2/264e8/1 –
  • 我想我知道为什么。该过程创建一个表,其中包含一组列,其名称基于status 字段。如果另一个user_name 具有与status 不同的行数,那么它将为该用户创建或多或少的字段并尝试将其加入表中。这将是艰难的。
猜你喜欢
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多