【问题标题】:Dynamic table/matrix using PHP and MySQL使用 PHP 和 MySQL 的动态表/矩阵
【发布时间】:2013-04-06 13:12:43
【问题描述】:

我在尝试以表格格式显示 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>

我想知道是否有更好的方法来实现相同的结果?

【问题讨论】:

    标签: php mysql html-table


    【解决方案1】:

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

    SELECT item,
           SUM(CASE WHEN location = 'Germany' AND currency = 'EUR' THEN amount ELSE NULL END) Germany_EUR,
           SUM(CASE WHEN location = 'Germany' AND currency = 'GBP' THEN amount ELSE NULL END) Germany_GBP,
           SUM(CASE WHEN location = 'Spain' AND currency = 'GBP' THEN amount ELSE NULL END) Spain_GBP,
           SUM(CASE WHEN location = 'UK' AND currency = 'GBP' THEN amount ELSE NULL END) UK_GBP,
           SUM(CASE WHEN location = 'UK' AND currency = 'USD' THEN amount ELSE NULL END) UK_USD
      FROM yourtable
     GROUP BY item
    

    这里是SQLFiddle

    【讨论】:

      【解决方案2】:

      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;
      

      SQL Fiddle with Demo。这给出了结果:

      |   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 |
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        相关资源
        最近更新 更多