Php 如何对mySQL表中的数据进行分组/汇总?

Php 如何对mySQL表中的数据进行分组/汇总?,php,mysql,sql,Php,Mysql,Sql,我在数据库中有一个表,我想对它执行mySQL查询。下面是该表的外观: 给定此表,我想显示每次旅程的用户总数/计数和目标名称 我尝试使用GROUP BY和COUNT,但我只得到以下结果: 如您所见,数据仅按goalname分组。有没有一种方法可以通过mySQL查询实现这种结果:?见下图 像这样的。我希望你能帮我做这件事。提前谢谢 您需要的是将列旋转成行。不幸的是,MySQL没有透视表操作符。但是您可以使用CASE表达式来执行此操作,如- SELECT journey, SUM(CASE W

我在数据库中有一个表,我想对它执行mySQL查询。下面是该表的外观:

给定此表,我想显示每次旅程的用户总数/计数和目标名称

我尝试使用GROUP BY和COUNT,但我只得到以下结果:

如您所见,数据仅按goalname分组。有没有一种方法可以通过mySQL查询实现这种结果:?见下图

像这样的。我希望你能帮我做这件事。提前谢谢

您需要的是将列旋转成行。不幸的是,MySQL没有透视表操作符。但是您可以使用CASE表达式来执行此操作,如-

SELECT
  journey,
  SUM(CASE WHEN  goalname = 'Frank.net Hospital Cash Back' THEN count END) AS `Frank.net Hospital Cash Back`,
  SUM(CASE WHEN  goalname = 'Frank.net Life Cover' THEN count END) AS `Frank.net Life Cover`,
  SUM(CASE WHEN  goalname = 'Frank.net Salary Protection' THEN count END) AS `Frank.net Salary Protection`,
  SUM(CASE WHEN  goalname = 'King Price Car Insurance' THEN count END) AS `King Price Car Insurance`
FROM test
GROUP BY journey;

SQLFIDLE示例-

下面的查询可能适用于您的情况

SELECT 
a.journey, 
a.goalname, 
FIND_IN_SET(a.goalname, (SELECT GROUP_CONCAT(goalname) FROM <table_name> b.journey =  a.journey)) AS no_of_goalname
FROM <table_name> a

您已经接受了答案,但只是为了好玩,如果您想动态生成列名,以便在输入新的goalName条目时,您不必更改代码,您可以使用下面的


+我想得很好。非常感谢你。我只是根据自己的需要修改了查询。我用计数代替了总数
DROP PROCEDURE IF EXISTS  getCount//
CREATE PROCEDURE getCount ()
BEGIN
  -- First we declare all the variables we will need
  DECLARE loopGoalName VARCHAR(100);
  DECLARE dynamicSql VARCHAR(5000);
  DECLARE finalSql VARCHAR(5000);
  -- flag which will be set to true, when cursor reaches end of table
  DECLARE exit_loop BOOLEAN;         

  -- Declare the sql for the cursor
  DECLARE example_cursor CURSOR FOR
    SELECT DISTINCT goalName
    FROM YourTableName;

  -- Let mysql set exit_loop to true, if there are no more rows to iterate
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE;
  SET dynamicSql = '';
  SET finalSql = '';
  -- open the cursor
  OPEN example_cursor;

  -- marks the beginning of the loop
  example_loop: LOOP

    -- read the name from next row into the variable l_name
    FETCH  example_cursor INTO loopGoalName;
    -- check if the exit_loop flag has been set by mysql, 
    -- if it has been set we close the cursor and exit 
    -- the loop
    IF exit_loop THEN
        CLOSE example_cursor;
        LEAVE example_loop;
    END IF;
    SET DynamicSql = CONCAT(DynamicSql,",SUM(IF(goalName='",loopGoalName,"',1,0)) as `",loopGoalName,"`");
  END LOOP example_loop;
  SET finalSql = CONCAT('SELECT journey',DynamicSql,
                         ' FROM yourTableName
                           GROUP BY journey');
  -- now we run set some variables and run the dynamically built query
  SET @finalSql = finalSql;
  PREPARE stmt1 FROM @finalSql;
  EXECUTE stmt1;
END//