Sql Oracle分析功能是否可能?

Sql Oracle分析功能是否可能?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,想知道是否有人对如何使用任何oracle分析函数重新编写此sql提出了建议。Oracle版本11gR2。提前谢谢 SELECT SUB_SEGMENT, SUM( CASE WHEN (TRANSACTION_MONTH = TO_CHAR(SYSDATE, 'MM')) AND (TRANSACTION_YEAR = (TO_CHAR(SYSDATE, 'YYYY'))) THEN TRAN_AMOUNT ELSE 0 END) AS MTD, SUM( CASE WH

想知道是否有人对如何使用任何oracle分析函数重新编写此sql提出了建议。Oracle版本11gR2。提前谢谢

SELECT SUB_SEGMENT,
SUM(
CASE
  WHEN (TRANSACTION_MONTH = TO_CHAR(SYSDATE, 'MM'))
  AND (TRANSACTION_YEAR   = (TO_CHAR(SYSDATE, 'YYYY')))
  THEN TRAN_AMOUNT
  ELSE 0
END) AS MTD,
SUM(
CASE
  WHEN (TRANSACTION_MONTH = TO_CHAR(ADD_MONTHS(SYSDATE,  -1), 'MM'))
  AND (TRANSACTION_YEAR   = (TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'YYYY')))
  THEN TRAN_AMOUNT
  ELSE 0
END) AS MONTH6,
SUM(
CASE
  WHEN (TRANSACTION_MONTH = TO_CHAR(ADD_MONTHS(SYSDATE,  -2), 'MM'))
  AND (TRANSACTION_YEAR   = (TO_CHAR(ADD_MONTHS(SYSDATE, -2), 'YYYY')))
  THEN TRAN_AMOUNT
  ELSE 0
END) AS MONTH5,
SUM(
CASE
  WHEN (TRANSACTION_MONTH = TO_CHAR(ADD_MONTHS(SYSDATE,  -3), 'MM'))
  AND (TRANSACTION_YEAR   = (TO_CHAR(ADD_MONTHS(SYSDATE, -3), 'YYYY')))
  THEN TRAN_AMOUNT
  ELSE 0
END) AS MONTH4,
SUM(
CASE
  WHEN (TRANSACTION_MONTH = TO_CHAR(ADD_MONTHS(SYSDATE,  -4), 'MM'))
  AND (TRANSACTION_YEAR   = (TO_CHAR(ADD_MONTHS(SYSDATE, -4), 'YYYY')))
  THEN TRAN_AMOUNT
  ELSE 0
END) AS MONTH3,
SUM(
CASE
  WHEN (TRANSACTION_MONTH = TO_CHAR(ADD_MONTHS(SYSDATE,  -5), 'MM'))
  AND (TRANSACTION_YEAR   = (TO_CHAR(ADD_MONTHS(SYSDATE, -5), 'YYYY')))
  THEN TRAN_AMOUNT
  ELSE 0
END) AS MONTH2,
SUM(
CASE
  WHEN (TRANSACTION_MONTH = TO_CHAR(ADD_MONTHS(SYSDATE,  -6), 'MM'))
  AND (TRANSACTION_YEAR   = (TO_CHAR(ADD_MONTHS(SYSDATE, -6), 'YYYY')))
  THEN TRAN_AMOUNT
  ELSE 0
END) AS MONTH1
FROM TRAN_TYPE
WHERE INCOMING_OUTGOING = 'I'
GROUP BY SUB_SEGMENT
ORDER BY DECODE(SUB_SEGMENT, 'Premium Plus', 1, 'Premium', 2, 'Upper Mass', 3);
解决方案-尝试以下输出

select * from 

(select count(1) payments, trunc(transaction_date,'MM') month_ from 
(select level * 12 + 11024294 payment_id,
case when round(11 * level * dbms_random.value) < 400 then round(11 * level * dbms_random.value) * 20
     when round(11 * level * dbms_random.value) < 800 then round(11 * level * dbms_random.value) * 3 
     else round(11 * level * dbms_random.value) end amount,
case when mod(level,2) = 0 or mod(level,2) = 3 then 'Premium Plus'
     when mod(level,2) = 5 or mod(level,3) = 1 then 'Premium'
     else 'Upper Mass'
end sub_segment,
to_date(round (dbms_random.value (1, 28))
        || '-'
        || round (dbms_random.value (7, 12))
        || '-'
        || round (dbms_random.value (2014, 2014)),
        'DD-MM-YYYY')
transaction_date
from dual tran_type
connect by level <= 20000) transaction_data
group by trunc(transaction_date,'MM'))

pivot(max(payments) as payments for month_ in 
('01-Jul-14' as jul14, '01-Aug-14' as aug14, '01-Sep-14' as sep14,
 '01-Oct-14' as oct14, '01-Nov-14' as nov14, '01-Dec-14' as dec14));
溶液扩展-


这看起来更像是PIVOT操作符的工作
select * from (select * from 

(select count(1) payments, trunc(transaction_date,'MM') month_ from 
(select level * 12 + 11024294 payment_id,
case when round(11 * level * dbms_random.value) < 400 then round(11 * level * dbms_random.value) * 20
     when round(11 * level * dbms_random.value) < 800 then round(11 * level * dbms_random.value) * 3 
     else round(11 * level * dbms_random.value) end amount,
case when mod(level,2) = 0 or mod(level,2) = 3 then 'Premium Plus'
     when mod(level,2) = 5 or mod(level,3) = 1 then 'Premium'
     else 'Upper Mass'
end sub_segment,
to_date(round (dbms_random.value (1, 28))
        || '-'
        || round (dbms_random.value (7, 12))
        || '-'
        || round (dbms_random.value (2014, 2014)),
        'DD-MM-YYYY')
transaction_date
from dual tran_type
connect by level <= 20000) transaction_data
group by trunc(transaction_date,'MM'))

pivot(max(payments) as payments for month_ in 
('01-Jul-14' as jul14, '01-Aug-14' as aug14, '01-Sep-14' as sep14,
 '01-Oct-14' as oct14, '01-Nov-14' as nov14, '01-Dec-14' as dec14)))

 unpivot(num_of_pmt for month in ("JUL14_PAYMENTS" as 'Jul-14',
 "AUG14_PAYMENTS" as 'Aug-14',
 "SEP14_PAYMENTS" as 'Sep-14',
 "OCT14_PAYMENTS" as 'Oct-14',
 "NOV14_PAYMENTS" as 'Nov-14',
 "DEC14_PAYMENTS" as 'Dec-14'));