2015-01-07 2 views
1

У меня есть таблица со следующими столбцами: Reportdate, Category.Дата разделения по месяцам и категории



Reportdate  Category 
------------------- 
01/01/2013  IT 
01/01/2013  Grounds 
01/01/2013  HVAC 
01/03/2013  HVAC 
02/01/2013  IT 
02/02/2013  IT 
02/02/2013  HVAC 
02/02/2013  Grounds 

Мне нужен запрос, который будет выводить следующее:



      Jan  Feb 
---------------------------  
IT   1  2 
Grounds 1  1 
HVAC  2  1 

Если кто-то может помочь, я бы очень признателен. Благодаря

+1

Похоже, вам нужен ['PIVOT'] (http://oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1.php). –

ответ

1

Простой способ сделать это с помощью условной агрегации:

select category, 
     sum(case when extract(month from reportdate) = 1 then 1 else 0 end) as Jan, 
     sum(case when extract(month from reportdate) = 2 then 1 else 0 end) as Feb 
from table 
group by category; 
0

Вы можете использовать PIVOT или вы можете попробовать следующее:

SELECT category 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 1, 1, 0)) AS "Jan" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 2, 1, 0)) AS "Feb" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 3, 1, 0)) AS "Mar" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 4, 1, 0)) AS "Apr" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 5, 1, 0)) AS "May" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 6, 1, 0)) AS "Jun" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 7, 1, 0)) AS "Jul" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 8, 1, 0)) AS "Aug" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 9, 1, 0)) AS "Sep" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 10, 1, 0)) AS "Oct" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 11, 1, 0)) AS "Nov" 
    , SUM(DECODE(EXTRACT(MONTH FROM reportdate), 12, 1, 0)) AS "Dec" 
    FROM mytable 
GROUP BY category 

Если вы хотите, чтобы дифференцировать в год, что может усложнить ситуацию!

Смежные вопросы