我在获取某些数据时遇到了问题。我有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}},来自1
的{{1}}和来自user_profile_gender
的{{1}}。>
是否可以创建这样的查询?我正在使用PostgreSQL 8.4
答案 0 :(得分: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
答案 1 :(得分: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