组合两个查询中的问题

问题描述:

我在提取某些数据时遇到问题。我有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应该从userage1user_profile_genderincomeresult.totalincome12000值。
是否可以创建这样的查询?我使用PostgreSQL 8.4

+1

确保运营商之间给出正确的终点。如果你的日期值没有时间分量,这可能是你想要的。但是,如果存在时间分量组件,则不会包含午夜(上午12:00:00)后发生的日期为2014-03-30的任何记录。您可能希望使用2014-03-31减去1毫秒作为上限。 –

我想你可以使用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 

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