2012-02-16 66 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