Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.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和MySQL的动态表/矩阵_Php_Mysql_Html Table - Fatal编程技术网

使用PHP和MySQL的动态表/矩阵

使用PHP和MySQL的动态表/矩阵,php,mysql,html-table,Php,Mysql,Html Table,我在试图以表格格式显示MySQL数据时遇到问题。基本上,我有一个表,其中存储了金额、项目、货币和地点字段的付款。我想在一个表格中显示这些内容,该表格显示顶部的位置、第二行的货币、第一列行的项目,然后是表格其余部分中与位置/货币对应的付款总额。下面是我的MySQL表数据示例: item | amount | currency | location ---------------------------------------------- Item 1 | 250 |

我在试图以表格格式显示MySQL数据时遇到问题。基本上,我有一个表,其中存储了金额、项目、货币和地点字段的付款。我想在一个表格中显示这些内容,该表格显示顶部的位置、第二行的货币、第一列行的项目,然后是表格其余部分中与位置/货币对应的付款总额。下面是我的MySQL表数据示例:

item        | amount | currency | location
----------------------------------------------
Item 1      | 250    | USD      | UK    
Item 2      | 450    | GBP      | UK
Item 3      | 780    | EUR      | Germany   
Item 2      | 50     | GBP      | Spain
Item 2      | 150    | GBP      | Spain
Item 4      | 375    | USD      | UK
Item 4      | 650    | GBP      | Germany
Item 1      | 350    | USD      | UK
我期待的最终结果是:

        |  Germany  | Spain |     UK    |
        | EUR | GBP |  GBP  | GBP | USD |
        ---------------------------------
Item 1  |     |     |       |     | 600 |
Item 2  |     |     |  200  | 450 |     |
Item 3  | 780 |     |       |     |     |
Item 4  |     | 650 |       |     | 375 |
目前,我正在使用多个查询来获得结果,其中每个项都使用了大量嵌套查询,如下所示:

<table width="1046" border="0">
  <tr>
    <td></td>
    <td colspan="2">Germany</td>
    <td>Spain</td>
    <td colspan="2">UK</td>
  </tr>
  <tr>
    <td></td>
    <td>EUR</td>
    <td>GBP</td>
    <td>GBP</td>
    <td>GBP</td>
    <td>USD</td>
  </tr>
  <? $q1 = mysqli_query("SELECT item FROM table1 group by item order by item asc");
  while($row1 = mysqli_fetch_assoc($q1)){
    $item = $row1['item']; ?>
    <tr>
      <td><? echo $item; ?></td>

      <? $q2 = mysqli_query("SELECT sum(amount) as amt from table1 WHERE currency='EUR' and item='$item' and location='Germany'");
      while($row2 = mysqli_fetch_assoc($q2)){ ?>
        <td><? echo number_format($row2['amt'],0); ?></td>
      <? } ?>

      <? $q3 = mysqli_query("SELECT sum(amount) as amt from table1 WHERE currency='GBP' and item='$item' and location='Germany'");
      while($row3 = mysqli_fetch_assoc($q3)){ ?>
        <td><? echo number_format($row3['amt'],0); ?></td>
      <? } ?>

      <? $q4 = mysqli_query("SELECT sum(amount) as amt from table1 WHERE currency='GBP' and item='$item' and location='Spain'");
      while($row4 = mysqli_fetch_assoc($q4)){ ?>
        <td><? echo number_format($row4['amt'],0); ?></td>
      <? } ?>

      <? $q5 = mysqli_query("SELECT sum(amount) as amt from table1 WHERE currency='GBP' and item='$item' and location='UK'");
      while($row5 = mysqli_fetch_assoc($q5)){ ?>
        <td><? echo number_format($row5['amt'],0); ?></td>
      <? } ?>

      <? $q6 = mysqli_query("SELECT sum(amount) as amt from table1 WHERE currency='USD' and item='$item' and location='UK'");
      while($row6 = mysqli_fetch_assoc($q6)){ ?>
        <td><? echo number_format($row6['amt'],0); ?></td>
      <? } ?>
    </tr>
    <? } ?>
</table>

德国
西班牙
英国
欧元
英镑
英镑
英镑
美元

我想知道是否有更好的方法达到同样的效果

MySQL没有PIVOT函数,但如果您想在一个查询中检索此数据,则可以使用带有
CASE
表达式的聚合函数将数据从行获取到列:

select item,
  sum(case when location = 'Germany' and currency = 'EUR' then amount else 0 end) Ger_EUR,
  sum(case when location = 'Germany' and currency = 'GBP' then amount else 0 end) Ger_GBP,
  sum(case when location = 'Spain' and currency = 'GBP' then amount else 0 end) Spa_GBP,
  sum(case when location = 'UK' and currency = 'GBP' then amount else 0 end) UK_GBP,
  sum(case when location = 'UK' and currency = 'USD' then amount else 0 end) UK_USD
from table1
group by item;
看。结果如下:

|   ITEM | GER_EUR | GER_GBP | SPA_GBP | UK_GBP | UK_USD |
----------------------------------------------------------
| Item 1 |       0 |       0 |       0 |      0 |    600 |
| Item 2 |       0 |       0 |     200 |    450 |      0 |
| Item 3 |     780 |       0 |       0 |      0 |      0 |
| Item 4 |       0 |     650 |       0 |      0 |    375 |

如果地点和货币是固定列表,那么您可以使用以下查询

选择项目,
金额(当地点为“德国”且货币为“欧元”时,则金额为空)德国欧元,
金额(当地点为“德国”且货币为“英镑”时,则金额为空)德国为英镑,
金额(当地点为“西班牙”且货币为“英镑”时,则金额为空)西班牙英镑,
金额(当地点为“英国”且货币为“英镑”时,则金额为空)英国英镑,
金额(当地点为“英国”且货币为“美元”时,则金额为空)UK_USD
从你的桌子上
按项目分组
这里是