2013-05-14 103 views
0

我必須提交由月和卡類型化OrderData組的一年是這樣的:集團由多列和case語句

MONTH CARDTYPE ORDER_CNT 
201201 AMEX 10,835 
201201 DISC 6,542 
201201 MC 2,675 
201202 AMEX 66,817 
201202 DISC 36,581 
201202 MC 165,683 

從中我能得到通過的每一天的數據有訂單表這個月。我用下面的SQL來分組以便通過卡型計數月的各日:

SELECT cardtype,orderdate,COUNT (distinct(orderserialno)) FROM tablename 
where orderdate between '01-jan-2012' and '31-dec-2012' 
GROUP BY cardtype,orderdate 

現在我需要通過使用上述形式呈現這個數據病例陳述,因爲我將不得不按月分組,但是我無法做到這一點。有人可以請幫助。

感謝

+0

DBMS是否使用的是(MySQL和MS-SQL中使用to_char(orderdate, 'YYYYMM')而不是訂購日期,Oracle等) – PinnyM 2013-05-14 17:54:09

+0

我正在使用Oracle。 – user2356581 2013-05-14 18:11:22

回答

1

到組由一個月,你可以只使用:

的SQLServer:

group by year(dateField)+month(dateField) 

或 甲骨文:

group by to_char(dateField, 'Year') + to_char(dateField, 'Month') 

所以您所查詢:

SELECT cardtype,COUNT (distinct(orderserialno)),year(dateField)+month(dateField) as order_date FROM tablename 
where orderdate between '01-jan-2012' and '31-dec-2012' 
GROUP BY cardtype,year(dateField)+month(dateField) 
+0

謝謝!這有幫助! – user2356581 2013-05-14 18:46:42

1
SELECT * FROM 
(
SELECT to_number(substr('201201', 1, 4)) curr_year 
     , to_number(substr('201201', -2, 2)) curr_month 
     , 'AMEX' card_type FROM dual 
    UNION ALL 
SELECT to_number(substr('201202', 1, 4)) 
     , to_number(substr('201202', -2, 2)) 
    , 'DISC' FROM dual 
) 
ORDER BY curr_year, curr_month, card_type 
/

CURR_YEAR CURR_MONTH CARD_TYPE 
------------------------------------ 
2012   1    AMEX 
2012   2    DISC 
1

您可以通過修改GROUP BY部分是這樣的:

GROUP BY cardtype, trunc(orderdate, 'MM') 

,並在SELECT部分,您應該