2014-12-03 4 views
0

Я использую Oracle SQL, и мне нужна помощь с жестким запросом.Выполнение одного и того же запроса снова и снова

У меня есть следующая таблица (MyTable):

id int, 
name1 int, 
name2 int, 
.. 
.. 
.. 
name80 int, 

Эти имена столбцов являются подделкой.

Вот мой запрос:

select id ,cnt/(select count(*) from MyTable) 
from(
    select id, name1, name2, count(distinct name1) over(partition by name2) cnt 
from my MyTable); 

Мне нужно выполнить этот запрос каждый раз, когда для следующей пары колонок. Например, следующая пара будет:

select id ,cnt/(select count(*) from MyTable) 
from(
    select id, name2, name3, count(distinct name2) over(partition by name3) cnt 
from my MyTable); 

И так далее.

Конечная таблица вывода должна включать идентификатор и расчет каждой пары.

id int, 
"calc of name1+name2" float, 
"calc of name2+name3" float, 
"calc of name3+name4" float, 
"calc of name4+name5" float, 
"calc of name5+name6" float, 
... 
... 
... 
"calc of name79+name80" float, 

Может кто-нибудь показать мне, как это сделать? Я буду очень признателен за любую помощь. Я чувствую себя потерянным.

+0

«Может кто-нибудь показать мне, как это сделать?» Кто-то определенно сможет, как только вы предоставите образец исходных данных и желаемого результата, лучше всего используйте [sqlfiddle] (http://sqlfiddle.com/#! 4). –

+0

Все исходные данные являются столбцами int. Имена колонок совершенно разные. Что-то не хватает? – Omri

+0

Я немного обеспокоен тем, что вы это делаете. Почему у вас 80 отдельных уровней гнездования - особенно в виде столбцов? –

ответ

3

Я что-то не хватает? Вы хотите получить такой запрос:

select id, 
     count(distinct name2) over (partition by name3)/count(*) over(), 
     count(distinct name3) over (partition by name4)/count(*) over(), 
     . . . 
from mytable; 

Я предполагаю, что ваша проблема заключается в наборе всех этих строк.

Вы можете запустить запрос, как это сгенерировать код:

select replace(replace('count(distinct <thiscol>) over (partition by <nextcol>)/count(*) over() as <thiscol>_<nextcol>,', 
         '<thiscol>', column_name 
        ), '<nextcol>', lead(column_name) over (order by column_id) 
      ) 
from all_tab_columns atc 
where table_name = 'mytable' 
+0

Гордон, вы слишком щедры. –

+0

@ Gordon Linoff: Я не могу объяснить, почему, но ваш запрос (первый) не возвращает те же значения, что и мой запрос. Фактически, ваш запрос всегда возвращает одно и то же значение. Любая идея почему? – Omri

+0

@ Omri. , , Нет, я не понимаю, почему. 'count (*) over()' и '(выберите count (*) из mytable)' должен возвращать то же самое в этом случае - нет 'group by' и no' where'. –

0

Вы можете использовать динамический SQL (EXECUTE IMMEDIATE) и USER_TAB_COLUMNS таблицу метаданных столбцов таблицы.

Смежные вопросы