Oracle SQL

Фильтр по тегу: connect by


Подсчитать сколько воскресений , понедельников , суббот и тд в заданном году

Авторский курс. SQL от новичка до профессионала. Бесплатное вводное занятие. Сертификат. Записывайся!
Прокачаю до уровня БОГ!


Подсчитать количество дней недели в заданном году
то есть сколько было в указанном году понедельников вторников воскресений ...
можно следующим образом :
   select count(1) dwcount,
          to_char(to_date('01/01/1940', 'DD/MM/YYYY') + level - 1, 'DAY') daywe -- 1940 это год , который нам нужен
     from dual
   connect by level <
              to_number(to_char(Trunc(To_Date(1940 + 1, 'YYYY'), 'YYYY') - 1, -- 1940 это год , который нам нужен
                                'ddd')) -- считаем колч дней 
    group by to_char(to_date('01/01/1940', 'DD/MM/YYYY') + level - 1, 'DAY'); -- группируем запрос по дням

один читатель, предложил свое решение, более рациональное и эффективное, подвергнув мое решение справедливой критике, публикую
  with t as (select to_date('31/12/'||'1940','dd/mm/yyyy') fd_year from dual)
    select to_char(t.fd_year-level+1,'DAY') fv_day,count(1) fn_count from t
    connect by level <= to_number(to_char(t.fd_year,'ddd'))
  group by to_char(t.fd_year-level+1,'DAY')
добавлено: 20 мар 17 просмотры: 2960, комментарии: 1



как размножить строки... cross join и connect by

Авторский курс. SQL от новичка до профессионала. Бесплатное вводное занятие. Сертификат. Записывайся!
Прокачаю до уровня БОГ!


итак , нам необходимо размножить строки в некоторой таблице, на основе заданного запроса
пусть это будет следующий запрос
select object_name from all_objects where object_type = 'CLUSTER'

этот запрос вернет нам 10 строк , по условиям задачи необходимо повторить эти 10 строк по 10 раз

создадим таблицу с размноженными строками , здесь на поможет конструкция cross join и оператор иерархии connect by
вот скрипт создания такой таблицы:
 create table copy1 as select * from 
 (select level lnl from dual connect by level < 11) 
cross join (select object_name from all_objects where object_type = 'CLUSTER') 

где level < 11 количество вставляемых строк

подсчитаем количество строк в данной таблице
 select count(*) from copy1

-- 100 строк, все верно

продемонстрируем работу оператора insert применительно к данной задаче
очистим таблицу
delete from copy1;

произведем вставку
insert into copy1(lnl, object_name) 
select * from (select level lnl from dual connect by level < 11) cross join 
(select object_name from all_objects where object_type = 'CLUSTER')


посмотрим, что получилось
select object_name,count(1) from copy1 group by object_name

успех...
добавлено: 13 мар 17 просмотры: 2075, комментарии: 0



Задача с валютами

Чалышев М.М www.orasource.ru ; резюме автора

Исходные данные
-- есть таблица в с номером валюты, датой заполнения курса, курсом валюты
-- оператор вводит курс валюты, когда он поменялся , то есть если несколько дней подряд одинаковый курс - то, в таблице будет единственное значение курса на дату изменения
-- необходимо вывести курс валюты на заданную дату , по каждой валюте
-- если на данную дату нет курса тогда выводится курс на последнюю дату, если в заданную дату курс менялся несколько раз , то надо вывести все изменения
-- Подготовим данные для примера
-- создадим таблицу с валютами
create table cratio as
(
  select 
    trunc(sysdate-dbms_random.value*10) ddate -- случайная дата отдаленная от текущего числа на случайное количество дней
  , trunc(dbms_random.value*3+1)  currency -- случайный номер валюты - идентификатор от 1 до 3
  , trunc(dbms_random.value*10) ratio  -- курс валюты от 1 до 10
     from dual
  connect by level <= 30)

читать дальше...
добавлено: 19 ноя 12 просмотры: 2861, комментарии: 7



Передача диапазонов значений в процедуру , в качестве входного параметра

Чалышев М.М www.orasource.ru изучаем SQL группа в контакте - присоединяйтесь
Подари, продай, обменяй - множество недорогих и отличных вещей: объявления вместо AVITO - ВКонтакте

Внимание!!! ТОЛЬКО ДЛЯ АЙТИшников скидка на проживание в одном из моих мини отелей 20%
пишите в личку ,если собираетесь в Москву или Питер vk.com/piterstylehostel vk.com/moscowstylehostel

разберем сегодня интересный пример - мы передаем в процедуру PL SQL набор диапазонов условных значений
необходимо сделать процедуру которая выводила бы значения числовой последовательностей например,
от - 1 до 5, 15-20, 33-38 , то есть произвольный перечень числовых диапазонов
напишем процедуру, где с помощью регулярных выражений разберем параметр и выведем диапазоны как запрос
для работы с текстовым передаваемым выражением используем конструкцию CONNECT BY
[src PLSQL]
create or replace procedure prc_test(p_period varchar2) is
читать дальше...
добавлено: 26 окт 12 просмотры: 5195, комментарии: 3