DISTINCT在同一查询中计数和求和

时间:2012-11-17 20:04:15

标签: php mysql

这是我的表

id , tiket_id , agency , problem
 1  , 123     , 1      ,  x
 2  , 123     , 1      ,  y
 3  , 124     , 2      ,  z

我有一个查询,根据代理机构给出了表格的统计数据,基本上是几个计数和总和

 SELECT  COUNT(*) as total , 
 SUM(CASE WHEN `agancy` = '1' THEN 1 ELSE 0 END) as ag_1
 SUM(CASE WHEN `agancy` = '2' THEN 1 ELSE 0 END) as ag_2

但我想要将具有相同ticket_id的行只计算一次

例如,前两行具有相同的票证ID,实际上它们是一张票。

我可以为总计数

这样做
 SELECT  COUNT(distinct(ticket_id)) as total , 

我不确定如何为SUM执行此操作? 我知道这不起作用

 SUM(  DISTINCT ticket_id CASE WHEN `agancy` = '1' THEN 1 ELSE 0 END) as ag_1

2 个答案:

答案 0 :(得分:1)

好吧,如果您只需要一个结果行:

select sum(cnt) as total, SUM(case when agency = 1 then 1 else 0 end) as ag1, SUM(case when agency = 2 then 1 else 0 end) as ag2 from (     
    SELECT COUNT(*) as cnt, agency
    from foo
    group by tiket_id,agency
) b

http://www.sqlfiddle.com/#!2/cde84/1

请注意,这假设两个不同的代理商不会共享ticket_id。

编辑。好吧,我重读了你的帖子,我不确定你是否想要表中的TOTAL行数或者只是唯一的票证ID。如果您只想要唯一的票证ID,那么您可以这样做:

select COUNT(*) as total , SUM(case when agency = 1 then 1 else 0 end) as ag1, SUM(case when agency = 2 then 1 else 0 end) as ag2 from (        
    SELECT COUNT(*) as cnt, agency
    from foo
    group by tiket_id,agency
) b;

请参阅:http://www.sqlfiddle.com/#!2/cde84/5

答案 1 :(得分:0)

我会说使用分组

SELECT  COUNT(*) as total , 
SUM(CASE WHEN `agancy` = '1' THEN 1 ELSE 0 END) as ag_1
SUM(CASE WHEN `agancy` = '2' THEN 1 ELSE 0 END) as ag_2
from mytable
group by tiket_id