MySQL将结果转换为表格网格式

时间:2013-05-08 13:57:53

标签: mysql

我有以下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 

返回以下内容:

enter image description here

我希望能够以下表格式返回结果:

enter image description here

有人知道我是否或如何在MySQL中执行此操作?

谢谢,

约翰

2 个答案:

答案 0 :(得分:0)

MySQL没有 pivot 函数,但您可以使用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;

答案 1 :(得分:0)

根据数据的复杂程度,可以使用bluefeet的方式,或者如果payment_method数量是动态的,那么听起来你需要一个数据透视表。试着看this