Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将具有多个值的水平表转换为聚合垂直表_Php_Mysql - Fatal编程技术网

Php 将具有多个值的水平表转换为聚合垂直表

Php 将具有多个值的水平表转换为聚合垂直表,php,mysql,Php,Mysql,我在苦苦思索如何做到这一点,我的大脑被难住了。 首先是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

我在苦苦思索如何做到这一点,我的大脑被难住了。 首先是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)."%";
就%而言,我想我会这样做:

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)."%";

如果您能提供任何正确方向的帮助/指点,我们将不胜感激。

您可以使用
GROUP BY
和对单个问题执行此操作。然后可以使用UNION将6个查询(针对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>

问题:
是%
否%
不适用%
希望这有帮助

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

如果我没弄错的话,你是想显示每个值(0,1,2)中“用户”的总百分比,对吗?为什么你不能数一数每个人和组?这正是我发布的内容,快告诉我吧。。您将获得百分比,一切都将在sql方面处理。感谢您的回复,我会尝试一下,让您知道我的进展情况。@Kaii:嗨,对不起,刚刚检查了示例sql百分比,效果很好。我如何用php将其打印在一个格式与我问题中的表格中$问题=获取记录\u sql(“选择“a1”作为问题,(总和(a1=1时的情况下,1其他0结束)/计数(id)*100)作为否百分比,(总和(a1=2时的情况下,1其他0结束)/计数(id)*100)作为是百分比,(总和(a1=3时的情况下,1其他0结束)/计数(id)*100)作为mdl iqer检查表中的不合格百分比”)@MatthewBrennand在编辑的答案中添加了php代码。在我为你投入了这么多工作之后,你介意接受我的回答吗?@Kaii:谢谢你的快速回复。我以为这是Php,因为这是我尝试过的,但它不起作用。如果我在phpmyadmin中运行SQL,它将返回结果,然后我尝试在$thequery上打印,得到数组,但php没有响应。