2013-10-08 75 views
6

我有以下MySQL查询:MySQL的汇总益智

select 
     members_categories.category_desc as 'membership_type', 
    SUM(CASE payment_method WHEN 'Bank Transfer' THEN amount_paid ELSE 0 END) AS 'Bank Transfer', 
    SUM(CASE payment_method WHEN 'Cash' THEN amount_paid ELSE 0 END) AS 'Cash', 
    SUM(CASE payment_method WHEN 'Cheque' THEN amount_paid ELSE 0 END) AS 'Cheque', 
    SUM(CASE payment_method WHEN 'Credit Card' THEN amount_paid ELSE 0 END) AS 'Credit Card', 
    SUM(CASE payment_method WHEN 'Direct Debit' THEN amount_paid ELSE 0 END) AS 'Direct Debit', 
    SUM(CASE payment_method WHEN 'PayPal' THEN amount_paid ELSE 0 END) AS 'PayPal', 
    SUM(CASE payment_method WHEN 'Salary Deduction' THEN amount_paid ELSE 0 END) AS 'Salary Deduction', 
    SUM(CASE payment_method WHEN 'Standing Order' THEN amount_paid ELSE 0 END) AS 'Standing Order', 
    SUM(amount_paid) AS 'Total' 
    FROM members_main, members_categories, members_payments 
    WHERE members_categories.category_code=members_main.membership_type and members_main.contact_id=members_payments.contact_id and members_payments.payment_date between '2012-01-01' and '2013-12-31' 
    GROUP BY membership_type With ROLLUP 

将返回:

enter image description here

你可以从汇总总在底部看到上面显示membership_type的descrption返回最后一行的字段。有没有一种方法可以用这个词取代这个合计

+1

酷不知道'ROLLUP' – Neal

+0

都能跟得上。在mysql语法中没有这样的选项。您必须检测重复的名称,理解为卷起字段的第一个实例是原始值,后续值是汇总。 –

+1

通过文档,该单元格值应该是NULL。这里有点鱼腥味。 http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html –

回答

1

使用IFNULL此:

select 
    IFNULL(members_categories.category_desc, 'Total') as 'membership_type', 

... 
GROUP BY membership_type With ROLLUP 

这确实你需要什么。如果你是完全符合ANSI,你会使用

GROUP BY members_categories.category_desc With ROLLUP 

如果您在GROUP BY子句中使用一个以上的项目,你需要处理他们所有IFNULL。例如,从你的SqlFiddle。 http://sqlfiddle.com/#!2/8818d/16/0

SELECT IFNULL(product,'GROUP TOTAL') AS product,  <--- group by term 
     IFNULL(year, 'YEAR TOTAL') as year,   <--- group by term 
     SUM(amount) 
    FROM test_rollup 
GROUP BY year, product WITH ROLLUP 
+0

谢谢。只是试了一下,得到了同样的结果。一些奇怪的事情我认为 –

+0

这是工作我在我的本地机器上测试 –

+0

由于某种原因,它绝对不在这里工作 - 我不知道为什么。这可能与数据有关吗? –