sql 分组按要求在一行显示问题

请教个sql问题 怎么按date和voucher_id 查询出所有的tax_type 并显示在一行
如图 就是把1767和1768后面的两个税放到1762中的位置

 select id,date,voucher_id,abstract,invoice_amount,tax_type,
if(tax_type='营业税',invoice_amount,'') 营业税,
if(tax_type='城市维护建设税',invoice_amount,'') 城市维护建设税,
if(tax_type='教育费附加',invoice_amount,'') 教育费附加,
if(tax_type='地方教育费附加',invoice_amount,'') 地方教育费附加,
if(tax_type='土地增值税',invoice_amount,'') 土地增值税
from cost where tax_type !='';

图片说明

用了group by 但应该不是这么写 请教大神

 select id,date,voucher_id,abstract,invoice_amount,tax_type,
if(tax_type='营业税',invoice_amount,'') 营业税,
if(tax_type='城市维护建设税',invoice_amount,'') 城市维护建设税,
if(tax_type='教育费附加',invoice_amount,'') 教育费附加,
if(tax_type='地方教育费附加',invoice_amount,'') a地方教育费附加,
if(tax_type='土地增值税',invoice_amount,'') 土地增值税
from cost where tax_type !=''
group by date,voucher_id;

图片说明

因为每条数据的id和abstract是不一样的,所以建议不参与统计,要实现你所说的功能,可以使用mysql的行转列函数MAX,实现如下:

 select b.date,b.voucher_id,
MAX(CASE b.tax_type WHEN '营业税' THEN b.invoice_amount ELSE 0 END) as '营业税',
MAX(CASE b.tax_type WHEN '城市维护建设税' THEN b.invoice_amount ELSE 0 END) as '城市维护建设税',
MAX(CASE b.tax_type WHEN '教育费附加' THEN b.invoice_amount ELSE 0 END) as '教育费附加',
MAX(CASE b.tax_type WHEN '地方教育费附加' THEN b.invoice_amount ELSE 0 END) as '地方教育费附加',
MAX(CASE b.tax_type WHEN '土地增值税' THEN b.invoice_amount ELSE 0 END) as '土地增值税'
from cost b where tax_type !=''
group by date,voucher_id

不知是否是你想要的结果