2016-04-13 7 views
0

Очень новый для подзапросов и я нуждаюсь в помощи.SQL-подзапрос в расчете SELECT

Хотелось бы запросить из одной базы данных. В рамках этого запроса я хотел бы вычислить переменную из двух переменных с этой базой данных (SUBQ и TOTAL). Моя проблема такова: моя переменная SUBQ должна быть подвержена дополнительному набору ограничений WHERE поверх тех, которые будут использоваться для всего запроса. Упрощенный пример код ниже:

create table [blah] 
    as select date_part('YEAR',DATE) as Orig_Year, 
      sum([SUBQ variable])/sum(TOTAL) as UD_Rate 
     from [database] 
     where [full query requirements] 
     group by date_part('YEAR',DATE) 

Я попытался создать подзапрос в рамках этого расчета, указав подзапрос в FROM заявления. Так, например,

   select date_part('YEAR',DATE1) as Orig_year, 
        sum(a.SUBQ)/sum(b.TOTAL) as UD_Rate 
      from database b, 
        (select SUBQ 
        from database 
        where DATE2 is not null and 
         months_between(DATE3,DATE2) <= 100 and 
         VALUE1 in ('A','B')) a 
      where VALUE2 between 50.01 and 100 
      group by date_part('YEAR',DATE1) 

Я нахожусь на правильном пути с моим мышлением здесь? Мне еще нужно приблизиться к функциональному запросу и не повезло найти аналогичный вопрос в Интернете, поэтому я нахожусь в том месте, где я поднял руки и пришел к вам. Хотя я мало знаю о них, было бы более целесообразным создать VIEW с значением SUBQ, а затем объединить его с более широким запросом?

Мысли о пирогах и пирожных для тех, кто готов помочь мне с этой просьбой. Спасибо.

+0

это поможет, если вы могли бы показать требование подзапросов и полный запросов –

+0

Вы делаете это настолько упрощенным, что не можем построить запрос. Покажите нам схему db, образцы данных и ожидаемый результат. \t Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. –

+0

Достаточно честный. Добавление ... –

ответ

1

Я думаю, что вы просто хотите агрегацию состояний в функции окна. Что-то вроде этого:

select sum(case when [subquery requirements] then t.subq else 0 end)/sum(t.Total) 
from t; 

Я уверен, что это то, что вы ищете. С точки зрения вашего create table:

select date_part('YEAR',DATE) as Orig_Year, 
     sum(case when ?? then Total else 0 end)/sum(TOTAL) as UD_Rate 
    from [database] 
    where [full query requirements] 
    group by date_part('YEAR', DATE); 

Я предполагаю, что столбец для сравнения является Total, в соответствии с условиями в when.

+0

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

+0

Это сработало отлично. –

0

Использование Common-Table-Expression затем:

-- Define the CTE expression name and column list. 
WITH subquery (Orig_year, UD_Rate) 
AS 
-- Define the CTE query. 
(
    select date_part('YEAR',DATE1) as Orig_year, 
        sum(a.SUBQ)/sum(b.TOTAL) as UD_Rate 
      from database b, 
        (select SUBQ 
        from database 
        where DATE2 is not null and 
         months_between(DATE3,DATE2) <= 100 and 
         VALUE1 in ('A','B')) a 
      where VALUE2 between 50.01 and 100 
      group by date_part('YEAR',DATE1) 
) 

И затем использовать subquery, как вы бы использовать таблицу внутри основного запроса