7 sql postgresql join group-by
我有一个这样的查询:
SELECT pt.id,
pt.plan_name,
pt.product_disc_amt,
pt.product_disc_perc,
SUM(ac.premium_amount) AS premium,
ac.id AS ac_id
FROM product pt
INNER JOIN age_classification ac
ON ac.p_id = pt.id
WHERE pt.medical_coverage_for = 'dependents_only'
OR (ac.relationship = 'child' AND ac.age_from::int <= 3 AND ac.age_to:: int >= 3
AND ac.gender = 'female' AND ac.marital_status = 'single')
OR (ac.relationship = 'child' AND ac.age_from::int <= 4 AND ac.age_to:: int >= 4
AND ac.gender = 'male' AND ac.marital_status = 'single' )
OR (ac.relationship = 'child' AND ac.age_from::int <= 2
AND ac.age_to:: int >= 2 AND ac.gender = 'female' AND ac.marital_status = 'single')
GROUP BY pt.id,
ac.premium_amount,
ac.id
Run Code Online (Sandbox Code Playgroud)
在此查询中,age_classification 是与产品的 One2Many 关系。它通过p_id.
我得到这样的o/p:
id plan_name product_disc_amt product_disc_perc premium ac_id
295 A 0 0 110 75
1543 B 0 0 90 69
1543 B 0 0 95 70
1543 B 0 0 132 71
Run Code Online (Sandbox Code Playgroud)
我的预期输出是:
id plan_name product_disc_amt product_disc_perc premium ac_id
295 A 0 0 110 75
1543 B 0 0 317 69 <------ Sample Value
Run Code Online (Sandbox Code Playgroud)
ac_id 不必是 69。我只是在那里写了一个 id,它在我得到的输出中。没有必要在ac_id. 我只是给了列来显示关系。由于它是在SELECT语句中给出的,我不知道预期输出中会出现什么值。所以我给出了一个值。
那就是我想得到premium_amounton id的总和1543。该行正在重复。由于我是 SQL 的新手,因此我没有解决此问题。提前致谢。
您还应该考虑plan_name到GROUP BY. 该列ac_id还可以防止行被组合。在这里,聚合可以提供帮助:
SELECT pt.id,
pt.plan_name,
pt.product_disc_amt,
pt.product_disc_perc,
SUM(ac.premium_amount) AS premium,
MAX(ac.id) AS ac_id
FROM product pt
INNER JOIN age_classification ac
ON ac.p_id = pt.id
WHERE pt.medical_coverage_for = 'dependents_only'
OR (ac.relationship = 'child' AND ac.age_from::int <= 3 AND ac.age_to:: int >= 3
AND ac.gender = 'female' AND ac.marital_status = 'single')
OR (ac.relationship = 'child' AND ac.age_from::int <= 4 AND ac.age_to:: int >= 4
AND ac.gender = 'male' AND ac.marital_status = 'single' )
OR (ac.relationship = 'child' AND ac.age_from::int <= 2
AND ac.age_to:: int >= 2 AND ac.gender = 'female' AND ac.marital_status = 'single')
GROUP BY pt.id,
pt.plan_name,
ac.premium_amount,
pt.product_disc_perc
Run Code Online (Sandbox Code Playgroud)