2013-12-18 13 views
0

我有一個數據庫中的表,我想執行一個MySQL查詢。下面是桌子的樣子:如何從mySQL表中分組/總數據?

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

對於這個表,我想顯示每次旅途和GOALNAME用戶總數/計數。

我試着使用GROUP BY和計數,但我只得到是這樣的:

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//