2

次のSQLコードがあります。

select distinct members_main.membership_type,
payment_method,sum(amount_paid) 
from members_main, members_payments
where members_main.contact_id=members_payments.contact_id 
group by members_main.membership_type,payment_method 

それは以下を返します:

ここに画像の説明を入力

次のテーブル グリッド形式で結果を返すことができるようにしたいと考えています。

ここに画像の説明を入力

MySQL内でこれを行うことができるかどうか、またはその方法を知っている人はいますか?

ありがとう、

ジョン

4

2 に答える 2

0

MySQL にはピボット関数がありませんが、CASE式と集計関数を使用して行を列に変換できます。

select  m.membership_type,
    sum(case when p.payment_method = 'Cash' then amount_paid else 0 end) Cash,
    sum(case when p.payment_method = 'Credit Card' then amount_paid else 0 end) CreditCard,
    sum(case when p.payment_method = 'Paypal' then amount_paid else 0 end) Paypal
from members_main m
inner join members_payments p
    on m.contact_id=p.contact_id 
group by m.membership_type;

の数が不明な場合はpayment_method、準備済みステートメントを使用して動的 SQL を生成することを検討してください。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(CASE WHEN p.payment_method = ',
      payment_method,
      ' THEN amount_paid else 0 END) AS `',
      payment_method, '`'
    )
  ) INTO @sql
FROM members_payments ;

SET @sql 
  = CONCAT('SELECT m.membership_type, ', @sql, ' 
            from members_main m
            inner join members_payments p
                on m.contact_id=p.contact_id 
            group by m.membership_type');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-05-08T14:00:50.400 に答える
0

データの複雑さに応じて、bluefeet の方法に従うか、または payment_method の金額が動的である場合は、ピボット テーブルが必要なようです。これを見てみてください。

于 2013-05-08T14:04:28.327 に答える