Some Playful, Complex & Amazing Queries

  1. Query to get Financial or Yearly Calendar from desired date.
with base as (
  select to_date(:Date2Cal, 'DD-Mon-YYYY') dt,
         to_number(to_char(to_date(:Date2Cal, 'DD-Mon-YYYY'), 'MM')) mm,
         to_number(to_char(to_date(:Date2Cal, 'DD-Mon-YYYY'),
                           'YYYY')) YYYY
    from dual),
     Dates as (
  SELECT case when upper(:fy) = 'Y' then
                to_date('01-Apr-' || case when mm < 4 then 
                                            to_char(YYYY -1)
                                          else to_char(YYYY) end,
                        'DD-Mon-YYYY')
              else trunc(dt, 'Year')
         end as first_date,
         Add_months(case when upper(:fy) = 'Y' then
                           to_date('01-Apr-' || 
                                   case when mm < 4 then          
                                          to_char(YYYY -1)
                                        else to_char(YYYY) end,
                                   'DD-Mon-YYYY')
                         else trunc(dt, 'Year')
                    end, 12) - 1 as last_date
    from base),
     Calandar as (
  SELECT first_date + LEVEL - 1 CDate, 
         to_char(first_date + LEVEL -1, 'DAY') WeekDay,
         to_number(to_char(first_date + LEVEL - 1, 'D')) WeekDayNo,
         ceil(level/7) as WeekNo,
         to_number(to_char(first_date + LEVEL - 1, 'YYYYMM')) YYYYMnth,
         to_number(to_char(first_date + LEVEL - 1, 'MM')) Mnth,
         to_char(first_date + LEVEL - 1, 'DD') dayte
    FROM Dates
 CONNECT BY LEVEL <= last_date + 1 - first_date), 
     Cal as (
  select CDate, WeekDay,
         to_number(to_char(CDATE, 'DD')) - 2 + 
           to_number(to_char(trunc(CDATE, 'Month'), 'D')) Position,
         WeekDayNo, WeekNo, YYYYMnth, Mnth, Dayte
    from Calandar),
     formatcal as (
  select max(weekno) weekno, max(YYYYMnth) YYYYMnth, max(mnth) nth,
         max (decode (WeekDayNo, 1, dayte, null)) Sun,
         max (decode (WeekDayNo, 2, dayte, null)) Mon,
         max (decode (WeekDayNo, 3, dayte, null)) Tue,
         max (decode (WeekDayNo, 4, dayte, null)) Wed,
         max (decode (WeekDayNo, 5, dayte, null)) Thu,
         max (decode (WeekDayNo, 6, dayte, null)) Fri,
         max (decode (WeekDayNo, 7, dayte, null)) Sat
    from Cal 
   group by mnth, trunc(position / 7) 
   order by mnth, trunc(position / 7)),
     kal as (
  select weekno, to_number(to_char(cdate, 'YYYYMM')) - 0.1 YYYYmnth, 
         to_number(to_char(cdate, 'MM'))-.1 mnth, null sun, 
         null mon, null tue,
         case when dayte = '01' then
                trim(to_char(cdate, 'Month')) ||' '|| 
                trim(to_char(cdate, 'YYYY'))
         end wed, null thu, null fri, null sat
    from cal
   where case when dayte = '01' then
                trim(to_char(cdate, 'Month')) ||' '||
                trim(to_char(cdate, 'YYYY'))
         end is not null
  union
  select weekno, YYYYmnth, mnth, sun, mon, tue, wed, thu, fri, sat 
    from formatcal 
   order by weekno, YYYYmnth, sun, mon, tue, wed, thu, fri, sat) 
select sun, mon, tue, wed, thu, fri, sat,
       case when trim(trim(sun) || trim(mon) || trim(tue) || 
                 --trim(wed) || 
                 trim(thu) || trim(fri) || trim(sat)) is null then 
              null
            else weekno end as weekno,
       case when trim(trim(sun) || trim(mon) || trim(tue) || 
                 --trim(wed) || 
                 trim(thu) || trim(fri) || trim(sat)) is null then 
              null
            when mnth <=  3 then 
              case when upper(:fy) = 'Y' then 4 else 1 end
            when mnth <=  6 then
              case when upper(:fy) = 'Y' then 1 else 2 end
            when mnth <=  9 then 
              case when upper(:fy) = 'Y' then 2 else 3 end
            when mnth <= 12 then 
              case when upper(:fy) = 'Y' then 3 else 4 end
       end QrtrNo
  from kal; 

Note:
Input Value for :FY = 'N'
Input Value for :Date2Cal = '30-Jan-1975'

Try with:
Input Value for :FY = 'Y'
Input Value for :Date2Cal set to any desired date of your wish
SUNMONTUEWEDTHUFRISATWEEKNOQRTRNO
   January 1975     
   0102030411
0506070809101121
1213141516171831
1920212223242541
262728293031 51
   February 1975     
      0151
0203040506070861
0910111213141571
1617181920212281
232425262728 91
   March 1975     
      0191
02030405060708101
09101112131415111
16171819202122121
23242526272829131
3031     131
   April 1975     
  0102030405142
06070809101112152
13141516171819162
20212223242526172
27282930   182
   May 1975     
    010203182
04050607080910192
11121314151617202
18192021222324212
25262728293031222
   June 1975     
01020304050607232
08091011121314242
15161718192021252
22232425262728262
2930     262
Other months will be displayed so on and so forth…

2. Query to print string in X formation.

select rownum, substr(:str, level, 1) Vert,
       rpad(' ', level - 1, ' ') || substr(:str, level, 1) BackSlant,
       rpad(' ', length(:str) - level, ' ') ||
       substr(:str, level, 1) FrontSlant, level
  from dual
CONNECT BY level <= length(:str)
union
select rownum + length(:str),
       substr(reverse(substr(:str, 1, length(:str)-1)), level, 1) Vert,
       rpad(' ', length(reverse(substr(:str, 1, 
                                length(:str)-1))) - level, ' ') ||
         substr(reverse(substr(:str, 1, length(:str)-1)), 
                                              level, 1) FrontSlant,
       rpad(' ', level, ' ') ||
         substr(reverse(substr(:str, 1, length(:str)-1)), level, 
                                                      1) BackSlant,
       length(:str)-1-level+1
  from dual
CONNECT BY level <= length(reverse(substr(:str, 1, length (:str)-1)))
 order by 1;

Note:
Input value for :str = 'Oracle11g'
Query output is as per below image.

3. Query to form left aligned triangle.

select rpad('*', level, '*') a
  from dual 
--where mod(level, 2) <> 0
connect by level <= :lvl;

Note:
Input value for :lvl= '7'
Query output is as per below image.

4. Query to form left aligned inverted triangle.

select rpad('*', decode (:lvl - level +1, 0, 1, :lvl - level +1), '*') a 
  from dual
--where mod(level, 2). <> 0
connect by level <= :lvl;

Note:
Input value for :lvl= '7'
Query output is as per below image.

5. Query to form right aligned triangle.

select lpad(' ', :lvl - level + 1, ' ') ||
       Rpad('*', decode(level, 0, 1, level), '*') a
  from dual
--where mod(level, 2) <> 0
connect by level <= :lvl;

Note:
Input value for :lvl= '7'
Query output is as per below image.

6. Query to form right aligned inverted triangle.

select lpad(' ', level - 1, ' ') ||
       rpad('*', decode (:lvl - level + 1, 0, 1, :lvl - leveL + 1), 
            '*') a 
  from dual
--where mod (level, 2) <>0 
connect by level <= :lvl;

Note:
Input value for :lvl= '7'
Query output is as per below image.

7. Query to form diamond.

select level, lpad(' ', (:lvl - level) / 2, ' ') ||
              rpad('*', level, '*') a
  from dual
 where mod(level, 2) <> 0
connect by level <= :lvl 
 union
select :lvl + level + 1, lpad(' ', ((level + 1) / 2), ' ') ||
       rpad('*', decode(:lvl - level - 2, 0, 1, :lvl - level - 1), 
            '*') a
  from dual
 where mod (level, 2) = 0 
connect by level <= :lvl - 1;

Note:
Input value for :lvl= 14
Query output is as per below image.

8. Query to form reverse diamond.

select rpad('*', decode (:lvl - level +1, 0, 1, :lvl - level + 1),
            '*') a, 
       lpad(' ', level - 1, ' ') ||
       rpad('*', decode(:lvl - level, 0, 1, :lvl - level + 1),
            '*') b
  from dual
--where mod(level, 2) <> 0
connect by level <= :lvl
union all 
select rpad('*', level, '*') a, 
       lpad(' ', :lvl - level, ' ') ||
       rpad('*', decode(level, 0, 1, level), '*') b
  from dual
 where /*mod(level, 2) <> 0 
   and*/ level > 1
connect by level <= :lvl;

Note:
Input value for :lvl= 14
Query output is as per below image.

9. Query to get mathematical table listing for desired number and up to desired limit.

select :No || ' x ' || level || ' = ' || :No * level tbl from dual
connect by level <= :lvl;

Note:
Input value for :lvl= 10
Input Value for :No = 17
Query output is as per below image.

10. Query to generate mathematical tables using cartesian product / cross join.

with a as (
  select level num1
    from dual
 connect by level <= :no),
     b as (
 select level num2
   from dual
connect by level <= :lvl)
select num1, num2, num1 || ' x ' || num2 || ' = ' || num1 * num2 tpl
  from a, b
 order by 1, 2;

Note:
Input value for :lvl= 5
Input Value for :No = 3
Query output is as per below image.

Published by Girish Kirtikumar Mehta.

Software engineer with 25+ years of experience in software development. Have exposure to domains like Core Banking System, Islamic Banking, Mutual Funds, Credit Cards, Insurance, Digital Gifts, Accounting, Construction, etc. Developed applications using C, various versions of Delphi (3, 5, 7, 2005, 2007, Xe2, Xe8 and 12.2), Oracle SQL & PL/SQL, MS SQL & T-SQL, MySQL, MS Access.

Leave a comment