SQL多次计数,按月分组

SQL多次计数,按月分组,sql,db2,Sql,Db2,我有一张桌子: STATUS DEFECT DATE CLOSED IP 01.01.2012 CLOSED TV 03.03.2012 CLOSED ADSL 05.05.2012 CLOSED ADSL 11.01.2012 CLOSED TV 15.01.2012 NEW TV NEW TV 我想按月份对每个特定缺陷进行分组。被视为已关闭的状态 结果表I希望是: MONTH

我有一张桌子:

STATUS  DEFECT   DATE

CLOSED  IP       01.01.2012 
CLOSED  TV       03.03.2012
CLOSED  ADSL     05.05.2012
CLOSED  ADSL     11.01.2012 
CLOSED  TV       15.01.2012
NEW     TV         
NEW     TV
我想按月份对每个特定缺陷进行分组。被视为已关闭的状态

结果表I希望是:

MONTH     TV  ADSL  IP
January   1   1     1
March     1   0     0
May       0   1     0
我使用的是db2数据库,因此显示月份的部分是:

select case month(timestamp_iso(DATE))
        when 1 then 'January'
        when 2 then 'February'
        when 3 then 'March'
        when 4 then 'April'
        when 5 then 'May'
        when 6 then 'Jun'
        when 7 then 'July'
        when 8 then 'August'
        when 9 then 'September' 
        when 10 then 'October'
        when 11 then 'November'
        when 12 then 'December'
    end as Month

from TABLE
where  STATUS='CLOSED'
group by month(timestamp_iso(DATE))
order by month(timestamp_iso(DATE))

因此,我只需要添加这一部分进行计数。谢谢,您可以使用另一个case语句对缺陷类别进行计数,该语句将计数限制为一个类别中的缺陷:

select case month(timestamp_iso(DATE))
        when 1 then 'January'
        when 2 then 'February'
        when 3 then 'March'
        when 4 then 'April'
        when 5 then 'May'
        when 6 then 'Jun'
        when 7 then 'July'
        when 8 then 'August'
        when 9 then 'September' 
        when 10 then 'October'
        when 11 then 'November'
        when 12 then 'December'
    end as Month,
    count (case when defect = 'TV' then 1 end) TV,
    count (case when defect = 'ADSL' then 1 end) ADSL,
    count (case when defect = 'IP' then 1 end) IP
from TABLE
where  STATUS='CLOSED'
group by month(timestamp_iso(DATE))
order by month(timestamp_iso(DATE))

您可以使用另一个case语句对缺陷类别进行计数,该语句将计数限制为一个类别中的缺陷:

select case month(timestamp_iso(DATE))
        when 1 then 'January'
        when 2 then 'February'
        when 3 then 'March'
        when 4 then 'April'
        when 5 then 'May'
        when 6 then 'Jun'
        when 7 then 'July'
        when 8 then 'August'
        when 9 then 'September' 
        when 10 then 'October'
        when 11 then 'November'
        when 12 then 'December'
    end as Month,
    count (case when defect = 'TV' then 1 end) TV,
    count (case when defect = 'ADSL' then 1 end) ADSL,
    count (case when defect = 'IP' then 1 end) IP
from TABLE
where  STATUS='CLOSED'
group by month(timestamp_iso(DATE))
order by month(timestamp_iso(DATE))