Sum和Group By问题

时间:2013-12-30 21:58:38

标签: mysql group-by sum

我更喜欢这两个表之间的SQL语句,以及group by子句的总和。

表1:num_calls_data

numcallsid, date_added,             date_of_call, teamlead, agent,    agent_username, agent_userrole, numcalls, teamsorter
'2275',     '2013-12-30 15:37:11', '2013-12-20', 'KARMEN', 'HANNAH', 'HannahCC',    'Front Office', '1',      '1'
'2276',     '2013-12-30 15:40:12', '2013-12-23', 'KARMEN', 'HANNAH', 'HannahCC', 'Support',      '1',      '2'
'2277',     '2013-12-30 15:40:48', '2013-12-23', 'KARMEN', 'HANNAH', 'HannahCC',    'Front Office', '0',      '1'

表2:dollars_data

dollarsid, date_added,            last_update_date, created_by, transaction_amt, enrollee, transaction_type, order_number, order_created
'21333',   '2013-12-30 15:38:39', '2013-12-20',     'HannahCC', '90.00',              '1',     'Item List Price', '345',        '2013-12-20'
'21334',   '2013-12-30 15:40:48', '2013-12-23',     'HannahCC', '-90.00',            '-1',    'Item Cancel',     '345',        '2013-12-20'
'21335',   '2013-12-30 15:40:48', '2013-12-23',     'HannahCC', '100.00',            '1',     'Item List Price', '999',        '2013-12-23'

SQL语句:

SELECT  
t.agent_userrole as agent_userrole, 
t.teamlead as teamlead,
t.agent as agent, 
t.agent_username as agent_username, 
t.numcalls as numcalls, 
d.created_by as created_by, 
date_format(d.last_update_date,'%Y-%m-%e') as last_update_date, 
sum(d.transaction_amt) as transaction_amt, 
sum(d.enrollee) as enrollee,
t.teamsorter as teamsorter 
FROM callconversion.dollars_data d, callconversion.num_calls_data t  
WHERE
t.agent_username=d.created_by  
AND d.last_update_date between '2013-12-1' and '2013-12-29'  
AND t.date_of_call=d.last_update_date 
GROUP BY  last_update_date, teamsorter, teamlead, agent_userrole, agent  
ORDER BY teamsorter asc, teamlead asc, agent_userrole asc, agent asc, last_update_date asc

返回输出:

agent_userrole,          teamlead, agent,    agent_username, numcalls, created_by, last_update_date, transaction_amt, enrollee, teamsorter
'Front Office',         'KARMEN', 'HANNAH', 'HannahCC',     '1',      'HannahCC',  '2013-12-20',     '90.00',         '1',      '1'
'Front Office',         'KARMEN', 'HANNAH', 'HannahCC',     '0',      'HannahCC',  '2013-12-23',     **'10.00',        '0'**,   '1'
'Registration Support', 'KARMEN', 'HANNAH', 'HannahCC',     '1',      'HannahCC',  '2013-12-23',     **'10.00',        '0'**,   '2'

预期/期望的输出:

agent_userrole,          teamlead, agent,    agent_username, numcalls, created_by, last_update_date, transaction_amt, enrollee, teamsorter
'Front Office',          'KARMEN', 'HANNAH', 'HannahCC',     '1',      'HannahCC', '2013-12-20',     '90.00',         '1',      '1'
'Front Office',          'KARMEN', 'HANNAH', 'HannahCC',     '0',      'HannahCC', '2013-12-23',     **'-90.00',      '-1'**,   '1'
'Registration Support',  'KARMEN', 'HANNAH', 'HannahCC',     '1',      'HannahCC', '2013-12-23',     **'100.00',      '1'**,    '2'

基于transaction_amt值,enrolleeGROUP BY列似乎以我不希望的方式进行总结。它似乎是由last_update_date总结的,但没有考虑具有差异因素的agent_userrole列。

2 个答案:

答案 0 :(得分:0)

问题似乎是date_of_calltimestamp似乎只是日期,不包括时间。因此,dollars_datalast_update_time = 2013-12-23的{​​{1}}行与num_calls_data中的date_of_call = 2013-12-23行匹配,因此输出显示两行的总和。由sum()加在一起的100.00和-90.00会产生10.00。

答案 1 :(得分:0)

要获得您想要的结果,您必须创建某种假的时间/等级来区分同一日期的行,以便它只在同一天加入一次。 这是sqlFiddle做类似的事情。

唯一的问题是,您不知道哪个agentuserroll会被分配哪个金额,因为在您的表格中似乎没有什么可以跟踪这种关系。

也许你想将order by numcallsiddollarsid添加到内部查询中,所以至少你知道首先创建的记录将与也是一个记录一起加入首先创建(如此sqlFiddle