2012-10-10 35 views
2

我的調查數據的一個表,其中的結果線被分成許多行,每行具有自己的變量名。GROUP BY上行一定值用作列

我的表看起來像這樣:

data_id data_content var_name   var_line 
1  1    SERIAL   1 
2  2    GND.AGE   1 
3  3    GND.NEWS.FREQ  1 
4  2    SERIAL   2 
5  3    GND.AGE   2 
6  3    GND.NEWS.FREQ  2 
7  3    SERIAL   3 
8  3    GND.AGE   3 
9  4    GND.NEWS.FREQ  3 

這裏是我當前的查詢檢索答案的總數GND.NEWS.FREQ的每一個可能的答案。正如總數:

SELECT *, COUNT(*) as total 
    FROM `data` 
WHERE `var_name` = 'GND.NEWS.FREQ' 
GROUP BY `data_content` 

現在我需要的功能添加到僅返回答案,其中GND.AGE例如爲3。因此,基本上把所有行var_line = 1爲單行。

我已經看過了透視表,但我不知道如何添加到我的當前查詢。

我想如果可能這樣做的一個查詢,但我不介意做這樣的事情在一個單獨的查詢得到var_line標識。

+0

看一看這些鏈接:[MySQL的數據透視表(變換行到列)](http://buysql.com/mysql/12-how-to-pivot-tables.html),[動態數據透視表(將行轉換爲列)](http://buysql.com/mysql/ 14如何對自動化樞軸-tables.html)。 – Devart

回答

2

不幸的是,MySQL沒有一個PIVOT功能基本上是你正在嘗試做的。因此,您需要使用CASE語句的聚合函數。如果你有var_name值的數目不詳的要轉成列,那麼你可以使用預處理語句:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when var_name = ''', 
     var_name, 
     ''' then var_line end) AS ', 
     replace(var_name, '.', '_') 
    ) 
) INTO @sql 
FROM data; 

SET @sql = CONCAT('SELECT data_content,', @sql, ' 
        from data 
        group by data_content 
        '); 

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

SQL Fiddle with Demo

+0

感謝bluefeet,這非常複雜,但看起來是我所追求的。 – pocketcup

+0

回到這個查詢後,我得到了準備位的錯誤。 '錯誤:您的SQL語法有錯誤;檢查對應於你的MySQL服務器版本正確的語法「以data_content從數據組」在2' 號線附近使用手冊 任何幫助將是巨大的,歡呼聲。 – pocketcup

+0

你能編輯一個sql小提琴併發布你的代碼嗎?我的版本似乎在演示中工作 - http://sqlfiddle.com/#!2/aeb7a/5。你使用的是什麼版本的MySQL? – Taryn