2012-12-05 112 views
1

喜算colums和组我有这样一个的Oracle SQL日期

C_DATE  SOURCE 
11/21/2012 A 
11/22/2012 A 
11/22/2012 A 
11/22/2012 A 
11/23/2012 A 
11/23/2012 A 
11/25/2012 A 
11/26/2012 A 
11/26/2012 B 
11/26/2012 B 
11/26/2012 B 
11/21/2012 B 
11/22/2012 B 
11/22/2012 B 
11/23/2012 B 
11/23/2012 C 
11/24/2012 C 
11/24/2012 C 
11/24/2012 C 
11/24/2012 C 
11/25/2012 C 

我如何通过源和日期有计数如下表:
c_date源的源B C源

11/21/2012 1 4 0 
11/22/2012 1 1 1 
11/23/2012 0 0 1 
11/24/2012 and so on.. 

我已经得到的最接近是一样的东西

select trunc(c_date) XDATE, 
     (select count(**) from TABLE where source='A') A, 
     (select count(**) from TABLE where source='B') B, 
     (select count(*) from TABLE where source='C') C 
from TABLE 
group by trunc(C_DATE) 
order by trunc(C_DATE) asc 

但它重复每行的总数我无法找到如何将计数列与日期关联。

非常感谢您的帮助

+0

什么是你的Oracle版本? – Mat

+0

嗨,oracle数据库11g – rjavy

+0

然后考虑为此使用一个数据透视表(http://www.oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1.php)。 – Mat

回答

1
select trunc(c_date) XDATE, 
     sum(case source when 'A' then 1 else 0 end) cnt_a,  
     sum(case source when 'B' then 1 else 0 end) cnt_b, 
     sum(case source when 'C' then 1 else 0 end) cnt_c, 
    from TABLE 
group by trunc(C_DATE) 
order by trunc(C_DATE) asc 

更新只要你用11g中,你可以使用现代化的枢纽条款:)

select xdate, a, b, c 
    from 
(select trunc(c_date) XDATE, source, count(*) 
    from tab 
    group by trunc(c_date), source)  
    pivot 
(count(*) for source in ('A' a, 'B' b, 'C' c)) 
order by 1; 

http://sqlfiddle.com/#!4/d0269/16

+0

优秀...!刚刚好。如果我想要一个额外的列,这三个来源的总和呢?非常感谢 – rjavy

+0

@rjavy,那就是'sum(1)'或'count(*)' –

+0

你是对的。谢谢你的帮助 – rjavy