1

OK、次のような販売テーブルがあります。

Prod_ID | Store_ID | Date_Sold | Num_Sold

105 | 1010 | 2012-09-21 | 50
105 | 1011 | 2012-09-22 | 20
105 | 1012 | 2012-09-22 | 35
...........................................。
109 | 1010 | 2012-09-21 | 25
109 | 1011 | 2012-09-23 | 15
109 | 1012 | 2012-09-23 | 30

次のような新しいテーブルまたはビューを作成したいと思います。

Store_ID | 105 | ... | 109

1010 | 50 | ... | 25
1011 | 20 | ... | 15
1012 | 35 | ... | 30

これを実現する方法がよくわかりません。人々がこれをハードコーディングする場所を見てきましたが、50を超える異なるProd_IDがあり、それらは絶えず変化しているため、これは行いたくありません。これを動的に行う方法はありますか?このデータをPHP経由でWebページに表示するので、PHPを使用してもっと簡単な方法があるのではないでしょうか。この説明が不明な場合はお知らせください。

前もって感謝します!!

4

2 に答える 2

2

MySQL では、データに対して準備済みステートメントを使用する必要がありPIVOTます。MySQL には関数がないためPIVOT、次のように集計関数を使用する必要がありますCASE

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when Prod_ID = ''',
      Prod_ID,
      ''' then Num_Sold end) AS ''',
      Prod_ID, ''''
    )
  ) INTO @sql
FROM  yourtable;

SET @sql = CONCAT('SELECT store_id, ', @sql, ' 
                  FROM yourtable 
                   GROUP BY store_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

デモで SQL Fiddle を参照してください

列の数がわかっている場合は、次のように値をハードコーディングします。

select store_id,
  sum(case when prod_id = 105 then Num_Sold end) as '105',
  sum(case when prod_id = 109 then Num_Sold end) as '109'
from yourtable
group by store_id

SQL Fiddle with Demoを参照してください

于 2012-10-03T17:40:49.077 に答える
1

したがって、上のビューはMySQLでの出力です。PHPを使用すると、データを好きなようにレイアウトでき、問題を解決できます。テーブルに繰り返し行を作成し(レイアウトの場合はhtml、繰り返しの場合はphp)、そのテーブル内にPHPを介して呼び出されたMySQLステートメントの出力を配置します。

MySQL接続(PHP)のセットアップと、もちろんテーブル(HTML)のレイアウトの両方のために、これに含まれる大量のコードがあります。

于 2012-10-03T17:52:25.513 に答える