2012-10-23 17 views
5

लंबे समय तक सूचीकर्ता, पहली बार कॉलर द्वारा समूह करने की आवश्यकता है। मैं क्रिस्टल रिपोर्ट 2010 का उपयोग कर रहा हूं।क्रिस्टल रिपोर्ट्स को व्युत्पन्न दिनांक सीमा

मेरे पास दैनिक व्यापार जानकारी है जो वॉल्यूम नहीं बदलती है, तो मुझे एक साथ समूह करने की आवश्यकता है। यहां बताया गया है कि डेटा कैसा दिखता है।

व्यापार # BegDate EndDate वॉल्यूम

1  1/1/2012 1/2/2012 500 
1  1/2/2012 1/3/2012 500 
1  1/3/2012 1/4/2012 1000 
1  1/4/2012 1/5/2012 750 
1  1/5/2012 1/6/2012 750 
1  1/6/2012 1/7/2012 500 
1  1/7/2012 1/8/2012 500 
1  1/8/2012 1/9/2012 500 

मैं इसे इस तरह देखने की जरूरत है।

व्यापार # DATERANGE वॉल्यूम

1  1/1/2012 - 1/3/2012 500 
1  1/3/2012 - 1/4/2012 1000 
1  1/4/2012 - 1/6/2012 750 
1  1/6/2012 - 1/9/2012 500 

मैं व्युत्पन्न तिथि सीमाओं से समूह की जरूरत है, लेकिन मुझे यकीन है कि कैसे क्रिस्टल के साथ यह पूरा करने के लिए नहीं कर रहा हूँ। कोई विचार??

+0

मैं लगता है कि इस सवाल का http://stackoverflow.com/questions/13269569/drive-enddate-of समान है ऊपर आ सकता है -कुरेंट-पंक्ति-से-स्टर्डेट-ऑफ-अगली-पंक्ति/13418153 # 13418153 – WKordos

उत्तर

0
with w as (
    select 1 id, to_date('1/1/2012', 'mm/dd/yyyy') db, to_date('1/2/2012', 'mm/dd/yyyy') de, 500 s from dual 
    union all 
    select 1, to_date('1/2/2012', 'mm/dd/yyyy'), to_date('1/3/2012', 'mm/dd/yyyy'), 500 from dual 
    union all 
    select 1, to_date('1/3/2012', 'mm/dd/yyyy'), to_date('1/4/2012', 'mm/dd/yyyy'), 1000 from dual 
    union all 
    select 1, to_date('1/4/2012', 'mm/dd/yyyy'), to_date('1/5/2012', 'mm/dd/yyyy'), 750 from dual 
    union all 
    select 1, to_date('1/5/2012', 'mm/dd/yyyy'), to_date('1/6/2012', 'mm/dd/yyyy'), 750 from dual 
    union all 
    select 1, to_date('1/6/2012', 'mm/dd/yyyy'), to_date('1/7/2012', 'mm/dd/yyyy'), 500 from dual 
    union all 
    select 1, to_date('1/7/2012', 'mm/dd/yyyy'), to_date('1/8/2012', 'mm/dd/yyyy'), 500 from dual 
    union all 
    select 1, to_date('1/8/2012', 'mm/dd/yyyy'), to_date('1/9/2012', 'mm/dd/yyyy'), 510 from dual  
    ) 

select tmin.db, tmax.de, tmin.s 
from 
(  
    select 
     row_number() over (order by db) id, 
      db, 
      s 
    from 
    ( 
     select 
      db, 
      s, 
      case 
        when ps is null 
         then 1 
        when ps != s 
         then row_number() over (order by db) 
       else 0 end num 
     from (

      select 
        (db) 
        , (de) 
        , lag (s,1) over (ORDER BY db) ps     
        , s 


      from w 
      ) t 
) t1 
    where num != 0 
) tmin, 

(select 
    row_number() over (order by db) id, 
     de, 
     s 
from 
(  
    select 
      db, 
      de, 

      s, 
      case 
       when ps is null 
        then 1 
       when ps != s 
        then row_number() over (order by de desc) 
      else 0 end num 
    from (

     select 
        db 
       ,(de) 
       , lag (s,1) over (ORDER BY de desc) ps     
       , s     

     from w 
     order by db 
     ) t 
) t1 
where num != 0) tmax 

where tmin.id = tmax.id 
+0

-1 गलत परिणाम, खराब चर नाम। –

+0

काम करता है लेकिन समझ में नहीं आता है और इसलिए प्रतिकृति नहीं है। बस अपनी रुचि के लिए +1। – Rachcha

4
with w as (
select 1 id, to_date('1/1/2012', 'mm/dd/yyyy') start_date, to_date('1/2/2012', 'mm/dd/yyyy') end_date, 500 sales_volume from dual 
union all 
select 1, to_date('1/2/2012', 'mm/dd/yyyy'), to_date('1/3/2012', 'mm/dd/yyyy'), 500 from dual 
union all 
select 1, to_date('1/3/2012', 'mm/dd/yyyy'), to_date('1/4/2012', 'mm/dd/yyyy'), 1000 from dual 
union all 
select 1, to_date('1/4/2012', 'mm/dd/yyyy'), to_date('1/5/2012', 'mm/dd/yyyy'), 750 from dual 
union all 
select 1, to_date('1/5/2012', 'mm/dd/yyyy'), to_date('1/6/2012', 'mm/dd/yyyy'), 750 from dual 
union all 
select 1, to_date('1/6/2012', 'mm/dd/yyyy'), to_date('1/7/2012', 'mm/dd/yyyy'), 500 from dual 
union all 
select 1, to_date('1/7/2012', 'mm/dd/yyyy'), to_date('1/8/2012', 'mm/dd/yyyy'), 500 from dual 
union all 
select 1, to_date('1/8/2012', 'mm/dd/yyyy'), to_date('1/9/2012', 'mm/dd/yyyy'), 500 from dual  
) 

,t as (select sales_volume 
      ,start_date 
      ,end_date 
      ,lag (sales_volume,1) over (order by start_date) prev_sales_volume 
     from w 
     order by start_date) 
,u as (select * 
     from t 
     where nvl(prev_sales_volume,-1) != sales_volume 
     order by start_date) 
select start_date 
     ,nvl(lead (start_date,1) over (order by start_date),(select max(end_date) from w)) end_date 
     ,sales_volume 
from u 
order by start_date 
+0

पूरी तरह से काम करता है, ऐसा लगता है कि नौकरी पाने के लिए न्यूनतम कोड कोड कर सकता है। अभी भी और समाधान की तलाश है। +1। – Rachcha

+0

मुझे सबसे अच्छा और सबसे कॉम्पैक्ट उत्तर मिला है। धन्यवाद! +50। – Rachcha

1

मैं प्रत्येक पंक्ति से अंतिम को छोड़कर सभी को छिपाने के लिए "एक्स -2" दमन फ़ंक्शन का उपयोग करें चाहते हैं, और अंतिम बिंदु को खोजने के लिए पिछला() और अगला()।

बेगडेट द्वारा समूह; विवरण और समूह पाद लेख खंडों को दबाने।

कहीं एक {} @UpdateCurrentBegDate समारोह बनाएं समूह हैडर

WhilePrintingRecords;  
Global DateVar CurrentBegDate; 

If PreviousIsNull({table.Volume}) or Previous({table.Volume}) <> {table.Volume} 
    Then (//We found a new range 
     CurrentBegDate = {table.BegDate}; 
    ); 

""; //Display nothing on screen 

और एक {} @DisplayBegDate समारोह जहां आप वर्तमान में है BegDate धारा विशेषज्ञ को दिखाया जा रहा है

EvaluateAfter({@UpdateCurrentBegDate}); 
Global DateVar CurrentBegDate; 

जाओ में और दबाने के विकल्प (समूह शीर्षलेख अनुभाग के लिए) के बगल में "एक्स -2" पर क्लिक करें। इस के लिए सूत्र है वहाँ

Not(NextIsNull({table.Volume}) or Next({table.Volume}) <> {table.Volume}) 

आप योग या अन्य गणना करने की जरूरत है, तो आप इसे {@UpdateCurrentBegDate} समारोह में करना होगा (और आप {@UpdateCurrentValues} या करने के लिए नाम बदलने के लिए चाहते हैं कुछ समान)। आप एक नया फ़ंक्शन भी बना सकते हैं जो अगली() जानकारी को जांचता है यदि आप समूह बदलते समय केवल चीजों को बदलना चाहते हैं - डिफ़ॉल्ट कुल फ़ंक्शंस का उपयोग करके छुपे हुए मान शामिल होंगे।

+0

बढ़िया, मुझे यह पोस्ट करने के बाद "मुझे एक शुद्ध SQL समाधान की आवश्यकता नहीं है" दिखाई नहीं दिया। हालांकि मैं इसे हटा नहीं दूंगा, यह मूल प्रश्न का उत्तर देता है। – EvilBob22

+0

आपके उत्तर के लिए धन्यवाद। यहां तक ​​कि मैं इसे हटा नहीं दूंगा। मेरे पास कुछ बाधाएं हैं जिन्होंने शुद्ध SQL समाधान की आवश्यकता बनाई है। मैं अभी तक स्टीवो के जवाब का प्रयास करने और परीक्षण करने के लिए अभी तक प्रयास नहीं कर रहा हूं। अगर किसी को इस तरह के समाधान की ज़रूरत है तो मैं तुम्हारा यहां रखूंगा। आपकी रुचि के लिए +1। इस बीच, कृपया इसे देखें कि आपको केवल SQL पर आधारित समाधान मिलता है।यह एक बड़ी मदद की होगी। – Rachcha

0

यह सबसे सुरुचिपूर्ण समाधान के साथ मैं

WITH DirectTrades(tradeid, SourceDate, EndDate, Volume, Row, KillRow, Depth) AS 
(
    SELECT tradeid 
      BegDate AS SourceDate, 
      EndDate, 
      Volume, 
      ROW_NUMBER() over (partition by Table# order by BegDate) AS Row, 
      ROW_NUMBER() over (partition by Table# order by BegDate) AS KillRow, 
      0 AS Depth 
    FROM Trade 
    UNION ALL 
    SELECT t1.Tradeid 
      dt.SourceDate, 
      t1.EndDate, 
      t1.Volume, 
      dt.Row, 
      dt.Row + dt.Depth + 1, 
      dt.Depth + 1 
    FROM Trade AS t1 
      INNER JOIN 
      DirectTrades AS dt ON 
        t1.BegDate=dt.EndDate AND 
        t1.Volume=dt.Volume AND 
        t1.tradeid=dt.Tradeid 
) 

SELECT dt1.Tradeid 
     dt1.SourceDate, 
     dt1.EndDate, 
     dt1.Volume 
FROM DirectTrades dt1 
     INNER JOIN 
     (
     SELECT dt2.Row, 
       MAX(dt2.KillRow) AS KillRow 
     FROM DirectTrades dt2 
     WHERE dt2.Row NOT IN 
       (
       SELECT dt3.KillRow 
       FROM DirectTrades dt3 
       WHERE dt3.Depth <> 0 
       ) 
     GROUP BY dt2.Row 
     ) dt4 ON dt1.Row=dt4.Row AND dt1.KillRow=dt4.KillRow 
ORDER BY SourceDate 
+0

काम नहीं करता है। प्रश्न में वर्णित डेटा के साथ मेरे पास टेबल नाम 'ट्रेड (ट्रेड, बेडेट, अंतराल, वॉल्यूम)' है। कृपया एक समाधान प्रदान करें जो स्कीमा के अनुरूप होगा और तदनुसार आपके उत्तर को संपादित करेगा। – Rachcha

संबंधित मुद्दे