2013-07-17 2 views
2

У меня проблема с получением некоторых данных. У меня есть 4 таблицы
пользователя
user_profile
user_income
tax_categoryПроблема при объединении двух запросов

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

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

SELECT userid,user_profile_gender,date_part('years',age(user_profile_dob))+1 AS userage,incomeresult.totalincome FROM user 
LEFT JOIN user_profile ON user_profile_userid = user.userid 
INNER JOIN 
     (SELECT SUM(income_amount) totalincome, income_userid FROM user_income 
     WHERE income_date BETWEEN '2012-03-30' AND '2014-03-30' 
     GROUP BY income_userid) AS incomeresult ON user.userid = incomeresult.income_userid  
WHERE user.status = 1 

SELECT * FROM tax_category 
WHERE 70 BETWEEN taxcategory_agefrom AND taxcategory_ageto AND taxcategory_gender=1 AND 12000 BETWEEN taxcategory_incomefrom AND taxcategory_incometo 

Во втором запросе 70 должно быть значение от userage, 1 из user_profile_gender и 12000 от incomeresult.totalincome.
Возможно ли создать такой запрос? Я использую PostgreSQL 8.4

+1

Убедитесь, что между оператором предоставляется право конечных точек. Если ваши значения даты не имеют временной составляющей, это, вероятно, делает то, что вы хотите. Но если есть компонент времени в день, то никакие записи с датой 2014-03-30, которые происходят после полуночи (12:00:00 AM), не будут включены. Возможно, вы захотите использовать 2014-03-31 минус одна миллисекунда в качестве своего верхнего диапазона. –

ответ

2

Я думаю, вы могли бы использовать CTE синтаксис:

WITH A AS 
( 
SELECT 
    userid, 
    user_profile_gender, 
    date_part('years',age(user_profile_dob))+1 AS userage, 
    incomeresult.totalincome 
FROM 
    user 
    LEFT JOIN user_profile ON user_profile_userid = user.userid 
    INNER JOIN 
     (SELECT SUM(income_amount) totalincome, income_userid FROM user_income 
     WHERE income_date BETWEEN '2012-03-30' AND '2014-03-30' 
     GROUP BY income_userid) AS incomeresult ON user.userid = incomeresult.income_userid  
WHERE 
    user.status = 1 
) 
SELECT * 
FROM 
    tax_category 
    INNER JOIN A 
WHERE A.userage BETWEEN taxcategory_agefrom AND taxcategory_ageto AND taxcategory_gender=1 AND A.totalincome BETWEEN taxcategory_incomefrom AND taxcategory_incometo 
2
select 
    userid, 
    user_profile_gender, 
    date_part('years', age(user_profile_dob)) + 1 as userage, 
    incomeresult.totalincome, 
    tax_category.* 
from 
    user 
    left join 
    user_profile on user_profile_userid = user.userid 
    inner join 
     (
      select sum(income_amount) totalincome, income_userid 
      from user_income 
      where income_date between '2012-03-30' and '2014-03-30' 
      group by income_userid 
     ) as incomeresult on user.userid = incomeresult.income_userid 
    left join 
    tax_category on 
     date_part('years', age(user_profile_dob)) + 1 between taxcategory_agefrom and taxcategory_ageto 
     and taxcategory_gender = 1 
     and totalincome between taxcategory_incomefrom and taxcategory_incometo 
where user.status = 1 
Смежные вопросы