2012-02-16 61 views
1

我想要如何做到這一點,我的大腦被困住了。 首先這是mysql和php。將具有多個值的水平表轉換爲聚合的垂直表

我有一個表,說8列

id - user -a1 -a2 -a3 -a4 -a5 -a6 
518 96 0 1 2 1 0 0 
519 108 0 0 1 1 2 1 
520 56 1 0 1 0 1 2 

0 = no 
1 = yes 
2 = n/a 

我希望能夠選擇說這些列的6,但我要顯示這樣的:

Question - Yes      - No  - N/A 
    a1  %of all rows with 1  %of 0 %of 2 
    a2  %of all rows with 1  %of 0 %of 2 
    a3  %of all rows with 1  %of 0 %of 2 
    a4  %of all rows with 1  %of 0 %of 2 
    a5  %of all rows with 1  %of 0 %of 2 
    a6  %of all rows with 1  %of 0 %of 2 

對於%我相信我只想做這樣的事情:在正確的方向

$i = 0; 
if ($thequestion->a1==1) $i ++; 
$num_amount = $i; 
$num_total = '25'; 

$yespercentage = round($num_amount * 100/$num_total)."%"; 

任何幫助/指針將是greatl y讚賞。

+0

如果我得到這個權利喲你是否試圖顯示每個值(0,1,2)的「用戶」的總比例是正確的?爲什麼你不能指望每個人和小組? – gorelative 2012-02-16 13:11:58

回答

3

您可以對GROUP BYaggregate functions單個問題執行此操作。然後,您可以使用UNION將6個查詢(針對六個問題)合併爲一個結果。通過使用SUM(CASE WHEN ...),您可以單獨計算三種情況:是,否,不適用。

它有點長,但我不知道比這更好。它應該輸出你需要的表格,不用百分比。隨意插入的百分比,也可在此SQL做過計算:

SELECT 
    "a1" AS question, 
    SUM(CASE WHEN a1 = 0 THEN 1 ELSE 0 END) AS no, 
    SUM(CASE WHEN a1 = 1 THEN 1 ELSE 0 END) AS yes, 
    SUM(CASE WHEN a1 = 2 THEN 1 ELSE 0 END) AS na, 
    COUNT(id) AS total 
FROM tbl 
UNION ALL 
SELECT 
    "a2" AS question, 
    SUM(CASE WHEN a2 = 0 THEN 1 ELSE 0 END) AS no, 
    SUM(CASE WHEN a2 = 1 THEN 1 ELSE 0 END) AS yes, 
    SUM(CASE WHEN a2 = 2 THEN 1 ELSE 0 END) AS na, 
    COUNT(id) AS total 
FROM tbl 
UNION ALL 
SELECT 
    "a3" AS question, 
    SUM(CASE WHEN a3 = 0 THEN 1 ELSE 0 END) AS no, 
    SUM(CASE WHEN a3 = 1 THEN 1 ELSE 0 END) AS yes, 
    SUM(CASE WHEN a3 = 2 THEN 1 ELSE 0 END) AS na, 
    COUNT(id) AS total 
FROM tbl 
UNION ALL 
SELECT 
    "a4" AS question, 
    SUM(CASE WHEN a4 = 0 THEN 1 ELSE 0 END) AS no, 
    SUM(CASE WHEN a4 = 1 THEN 1 ELSE 0 END) AS yes, 
    SUM(CASE WHEN a4 = 2 THEN 1 ELSE 0 END) AS na, 
    COUNT(id) AS total 
FROM tbl 
UNION ALL 
SELECT 
    "a5" AS question, 
    SUM(CASE WHEN a5 = 0 THEN 1 ELSE 0 END) AS no, 
    SUM(CASE WHEN a5 = 1 THEN 1 ELSE 0 END) AS yes, 
    SUM(CASE WHEN a5 = 2 THEN 1 ELSE 0 END) AS na, 
    COUNT(id) AS total 
FROM tbl 
UNION ALL 
SELECT 
    "a6" AS question, 
    SUM(CASE WHEN a6 = 0 THEN 1 ELSE 0 END) AS no, 
    SUM(CASE WHEN a6 = 1 THEN 1 ELSE 0 END) AS yes, 
    SUM(CASE WHEN a6 = 2 THEN 1 ELSE 0 END) AS na, 
    COUNT(id) AS total 
FROM tbl 

例如百分比:

SELECT 
    "a1" AS question, 
    (SUM(CASE WHEN a1 = 0 THEN 1 ELSE 0 END)/COUNT(id) * 100) AS no_percentage, 
    (SUM(CASE WHEN a1 = 1 THEN 1 ELSE 0 END)/COUNT(id) * 100) AS yes_percentage, 
    (SUM(CASE WHEN a1 = 2 THEN 1 ELSE 0 END)/COUNT(id) * 100) AS na_percentage 
FROM tbl 

所需的PHP打印例如:

<table> 
    <thead> 
    <tr> 
     <td>Question</td> 
     <td>Yes %</td> 
     <td>No %</td> 
     <td>N/A %</td> 
    </tr> 
    </thead> 
    <tbody> 
<?php 
// given this functions returns the result set as multi-dimensional array 
$rows = get_records_sql($thequery); 
foreach ($rows as $row) { 
    echo '<tr>'; 
    echo '<td>'.$row->yes_percentage.'%</td>'; 
    echo '<td>'.$row->yes_percentage.'% </td>'; 
    echo '<td>'.$row->no_percentage.'% </td>'; 
    echo '<td>'.$row->na_percentage.'% </td>'; 
    echo '</tr>'; 
} 
?> 
    </tbody> 
</table> 
+0

這正是我發佈的內容,打敗了我..你會回到百分比,一切都在SQL的一面處理。 – gorelative 2012-02-16 13:19:47

+0

謝謝你的迴應,生病給它一個去,讓你知道我如何得到。 – Codded 2012-02-16 14:15:18

+0

@MatthewBrennand所以..它爲你工作? – Kaii 2012-02-16 21:27:21

0

希望這有助於

SELECT 
     SUM(CASE WHEN a1 = 0 THEN 1 ELSE 0 END) AS a1-NO, 
     SUM(CASE WHEN a1 = 1 THEN 1 ELSE 0 END) AS a1-Yes, 
     SUM(CASE WHEN a1 = 2 THEN 1 ELSE 0 END) AS a1-N/A, 
     ...// similarly for all other columns 
FROM table_name