MySQL以列方式连接同一表显示行(复杂)

MySQL以列方式连接同一表显示行(复杂),mysql,join,group-by,Mysql,Join,Group By,我想加入相同的表4次,以获得列的方式显示,我不确定是否有可能在1个SQL语句中完成 tbl_用户名 id username 1 Adam 2 Bob 3 Chris tbl_机会 我得到了这两张桌子,我希望结果是这样的 我使用以下sql进行了测试,但结果是错误的 SELECT users.`username`, COUNT(`proposal`.name) AS `Pro Total Number Quotation`, CONCAT('RM', FORMAT(SUM(`pr

我想加入相同的表4次,以获得列的方式显示,我不确定是否有可能在1个SQL语句中完成

tbl_用户名

id  username
1   Adam
2   Bob
3   Chris
tbl_机会

我得到了这两张桌子,我希望结果是这样的

我使用以下sql进行了测试,但结果是错误的

SELECT users.`username`, COUNT(`proposal`.name) AS `Pro Total Number Quotation`, CONCAT('RM', FORMAT(SUM(`proposal`.`amount`), 2)) AS pro_rm_amount, 
COUNT(`nego`.name) AS `nego Total Number Quotation`, CONCAT('RM', FORMAT(SUM(`nego`.`amount`), 2)) AS nego_rm_amount, 
COUNT(`cw`.name) AS `cw Total Number Quotation`, CONCAT('RM', FORMAT(SUM(`cw`.`amount`), 2)) AS cw_rm_amount,
COUNT(`cl`.name) AS `cl Total Number Quotation`, CONCAT('RM', FORMAT(SUM(`cl`.`amount`), 2)) AS cl_rm_amount

FROM tbl_username users
JOIN `tbl_opportunity` AS proposal ON (proposal.`user_id` = users.id AND proposal.`sales_stage` = 'Proposal' AND proposal.`deleted`=0 AND MONTH(`proposal`.date)= '1'
AND YEAR(`proposal`.date)= '2012')
LEFT JOIN `tbl_opportunity` AS nego ON (proposal.`user_id` = users.id AND proposal.`sales_stage` = 'Nego' AND nego.`deleted`=0 AND MONTH(`nego`.date)= '1'
AND YEAR(`nego`.date)= '2012')
LEFT JOIN `tbl_opportunity` AS cw ON (cw.`user_id` = users.id AND cw.`stage` = 'Win' AND cw.`deleted`=0 AND MONTH(`cw`.date)= '1'
AND YEAR(`cw`.date)= '2012')
LEFT JOIN `tbl_opportunity` AS cl ON (cl.`user_id` = users.id AND cl.`stage` = 'Lose' AND cl.`deleted`=0 AND MONTH(`cl`.date)= '1'
AND YEAR(`cl`.date)= '2012')

GROUP BY users.`username`

我有点困惑,因为您提供的表和列与您尝试使用的SQL中的表和列不太匹配。无论如何,考虑到您提供的数据和表格以及您指定的结果,这应该会对您有所帮助。即使不是这样,它也应该作为一个示例,说明如何将
SUM
CASE
结合使用(一个非常方便的用于平展数据的SQL组合)

试一试:

select u.username,
sum(case when lower(stage) = 'proposal' then 1 else 0 end) as "Proposal Count"  ,
sum(case when lower(stage) = 'proposal' then amount else 0 end) as "Proposal Amount",
sum(case when lower(stage) = 'nego' then 1 else 0 end) as "Nego Count"  ,
sum(case when lower(stage) = 'nego' then amount else 0 end) as "Nego Amount",
sum(case when lower(stage) = 'win' then 1 else 0 end) as "Win Count"  ,
sum(case when lower(stage) = 'win' then amount else 0 end) as "Win Amount",
sum(case when lower(stage) = 'lose' then 1 else 0 end) as "Lose Count"  ,
sum(case when lower(stage) = 'lose' then amount else 0 end) as "Lose Amount"
from tbl_username u
inner join tbl_opportunity o on u.id = o.user_id
group by u.username;

希望有帮助。

sql语句和表有点不同,因为我懒得再次键入它:pso您想得到哪一个的答案?您尝试过的查询中引用的示例表还是表和列?如果您需要一个明确的答案,我建议您花点时间让示例表布局和数据与示例查询匹配。您好@Tom Mac,我已经更新了sql语句以匹配该案例。谢谢嗨@Tom Mac,非常感谢您的解决方案。我的MySQL知识告诉我,我的问题只能通过连接表来解决,但您给了我一个新的解决方案和视图。谢谢!