2012-02-16 3 views
1

Im stuggling, чтобы думать о том, как это сделать, мой мозг в тупике. Прежде всего это 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)."%"; 

Любая помощь/указатели в правильном направлении была бы великолепной я оценил.

+0

Если я получу это право лет Вы пытаетесь показать общий процент «пользователей» за значение (0,1,2) правильно? Почему вы не можете считать каждую группу? – gorelative

ответ

3

Вы можете сделать это для одного вопроса с GROUP BY и aggregate 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

+0

благодарю вас за ответ, плохо дайте ему уйти и дайте знать, как я нахожусь. – Codded

+0

@MatthewBrennand так .. это сработало для вас? – Kaii

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