Вы можете сделать это для одного вопроса с 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,1,2) правильно? Почему вы не можете считать каждую группу? – gorelative