2013-12-18 2 views
0

У меня есть таблица в базе данных, в которую я хочу выполнить запрос mySQL. Вот что таблица выглядит следующим образом:Как группировать/суммировать данные из таблицы mySQL?

https://docs.google.com/spreadsheet/ccc?key=0At5_g34zSM41dFlNWUdNQnRPandiUUFuaUJzTEc1REE&usp=sharing

Учитывая эту таблицу, я хочу, чтобы отобразить общее количество/количество пользователей за поездку и GOALNAME.

Я пытался использовать GROUP BY и COUNT, но то, что я только получаю это:

enter image description here

Как вы можете видеть, данные группируются только GOALNAME. Есть ли способ, которым я мог бы достичь такого результата через mySQL-запрос :? (См рисунок ниже)

enter image description here

Что-то вроде этого. Надеюсь, ты сможешь помочь мне в этом. Заранее спасибо!

ответ

2

Что нужно, чтобы PIVOT столбцы в строки. К сожалению, у MySQL нет оператора таблицы PIVOT. Но вы можете использовать выражение 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; 

SQLFiddle пример - http://sqlfiddle.com/#!2/314c6/8

+0

+1 Великий ум думает одинаково. –

+0

Большое вам спасибо. Я просто изменил запрос, чтобы он соответствовал моим потребностям. Я заменил сумму на COUNT. :) – maikelsabido

0

Ниже запроса может работать в вашем случае.

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 
0

вы уже приняли ответ, но просто для удовольствия, если вы хотите, чтобы динамически генерировать имена столбцов, так что, если введены новые записи из goalName вы не должны изменить свой код, который вы можете используйте нижеследующее (sqlFiddle)

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// 
Смежные вопросы