将Group By Result行转换为列(PHP MYSQL)

时间:2014-02-08 12:46:51

标签: php html mysql

我有桌子。

Country Status
USA     A
USA     A
USA     B
USA     C
UK      A
UK      D
UK      D
China   A
China   A
China   C
China   C

我想编写一个查询并在表格中显示结果,如下所示。

Country A   B   C   D   Total
USA     2   1   1   0   4
UK      1   0   0   2   3
China   2   0   2   0   4
Total   5   1   3   2  11

$q="SELECT Country,Status,Count(Status) as Stat Group BY Country,Status";
$r=mysql_query($q);
while($o=mysql_fetch_object($r)){
$t .="<tr>
      <td>$o->Country</td>
      <td>$o->Status</td>
      <td>$o->Stas</td>
      </tr>";
}

输出。我想要的就像上面那样。它将国家和地区分组,但我不想多次显示国家/地区。我想将状态的行输出显示为列并显示它的计数。

USA   A   2
USA   B   1
USA   C   1
UK    A   1
UK    D   2
China A   2
China C   2

2 个答案:

答案 0 :(得分:0)

您可以通过查询或直接进入PHP代码来执行此操作。在查询中,它被称为PIVOTing表。

它将是:

 select Country, A, B, C, D, (A+B+C+D) Total
   from (
     select Country
            sum(case status = 'A' then 1 else 0 end) as A,
            sum(case status = 'B' then 1 else 0 end) as B,
            sum(case status = 'C' then 1 else 0 end) as C,
            sum(case status = 'D' then 1 else 0 end) as D
       from yourtable
     group by Country
    ) as t

问题在于,对于每个新status,您都必须更改新的sum

答案 1 :(得分:0)

我也有同样的需要,这是我得到结果的sql:

SELECT practiceCode, A, B, C, D, (A+B+C+D) Total
FROM (
   SELECT practiceCode,
        SUM(CASE WHEN TYPE = 1 THEN 1 ELSE 0 END) AS A,
        SUM(CASE WHEN TYPE = 2 THEN 1 ELSE 0 END) AS B,
        SUM(CASE WHEN TYPE = 3 THEN 1 ELSE 0 END) AS C,
        SUM(CASE WHEN TYPE = 4 THEN 1 ELSE 0 END) AS D
   FROM laborder
   GROUP BY practiceCode, TYPE
) AS t