0

スタッフ名、月、注文などを含む小さなテーブルの結果を表示するバックエンドのあるphpページを作成しました。mysql

<table border="1" cellpadding="1" cellspacing="1">
   <thead>
        <tr>
    <th scope="col">Name</th>
    <th scope="col">Month</th>
    <th scope="col">Cases</th>    
  </tr>
   </thead>
  <?php do { ?>
  <tbody>
    <tr>
      <td><?php echo $row_rsChart2['ContactFullName']; ?></td>
      <td><?php echo $row_rsChart2['Month']; ?></td>
      <td><?php echo $row_rsChart2['Cases']; ?></td>
    </tr>
    </tbody>
    <?php } while ($row_rsChart2 = mysql_fetch_assoc($rsChart2)); ?>
</table>

月の列をヘッダーとして使用して、1 月、2 月、3 月などを列ヘッダーに左から右に表示し、各月のケースをデータとして表示することは可能ですか?

1月 - 2月 - 3月
ユーザー1 100 47 89
ユーザー2 86 67 134

デフォルトのレイアウトでは、次のように表示されます。

名前 - 月 - ケース
User1 100 年 1 月
ユーザー1 2月47日
User2 1967 年 1 月
4

1 に答える 1

2

MySQL には、このようなデータのピボットに対するネイティブ サポートはありません。いくつかのオプションがあります:

  1. ピボット操作を手動で実行するために、かなりひどい MySQL クエリを作成します。

    SELECT *
      FROM (
        SELECT StaffName, SUM(NumOrders) AS January
        FROM Orders
        WHERE Month = 'January'
        GROUP BY StaffName
      ) AS tJan
      NATURAL JOIN (
        SELECT StaffName, SUM(NumOrders) AS February
        FROM Orders
        WHERE Month = 'February'
        GROUP BY StaffName
      ) AS tFeb
      NATURAL JOIN (
        -- etc.
    

    この道をたどることを選択した場合は、PHP のループ構造または MySQL の準備済みステートメントのいずれかを使用して、このクエリを自動的に生成することで、作業が少し楽になります。

  2. 上記の操作を 1 回限りの操作として実行し、MySQL データベースの構造を変更して、この目的のレイアウトをより厳密に反映させます (テーブルが変換されると簡単ですが、データベースの他の使用に影響を与える可能性があります)。

    CREATE TABLE NewOrders (PRIMARY KEY('StaffName'))
    SELECT * FROM (
      -- etc. as above
    

    VIEWまたは、基礎となるテーブルに基づいて、このように構造化された一種の「仮想テーブル」を作成することもできます。

  3. PHP で手動でデータをピボットします (面倒です)。

于 2012-04-24T09:49:11.363 に答える