0

私はこのようなテーブルを持っています:

ID    CHANNEL  PRODUCT  VNAME         qty
1     MCN      zynga    zynga v10     100
2     AGN      zynga    zynga v10     100
3     WAR      zynga    zynga v10     200
4     WWW      zynga    zynga v10     250
5     MCN      capple   capple v52    700
6     AGN      capple   capple v52    100
7     WAR      capple   capple v52    200
8     MCN      zynga    zynga v21     50
9     AGN      zynga    zynga v21     30
10    WAR      zynga    zynga v21     20

次のような結果を生成するには、クエリが必要です。

ID    PRODUCT    MCN    AGN    WAR   WWW
1     zynga      150    139    220   270
2     capple     700    100    200   0

注: MCN、AGN、WAR、WWW の値は数量の合計値です

4

1 に答える 1

-1

この問題は、集計関数、具体的には group by と product の使用に加えて SUM(IF()) 関数の組み合わせで解決できます。

プリペアド ステートメントを使用した動的アプローチ

mysql ピボット/クロス集計クエリにリンクしている AshReva からのコメントに感謝します

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(IF(CHANNEL="',
      channel,
      '",qty,0)) as ',
      channel
    )
  ) INTO @sql
FROM prod;


SET @sql = CONCAT('SELECT product, ', @sql, ' 
                  FROM prod 
                  GROUP BY product');

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

SQL フィドル: http://www.sqlfiddle.com/#!2/ed185/5

これを解決する非動的な方法...

select PRODUCT, 
SUM(IF(CHANNEL="MCN", qty, 0)) as MCN,
SUM(IF(CHANNEL="AGN", qty, 0)) as AGN,
etc...
from PRODUCTS
GROUP by PRODUCT;

SQL フィドル: http://www.sqlfiddle.com/#!2/ed185/2

于 2013-05-28T14:30:04.187 に答える