我几乎是SQL的新手,遇到了我无法弄清楚的情况。假设我有2个表:P和A.
Person id Live Income
--------- -- ---- ------
Tom 1 House 10
Sarah 2 Apt 7
Sterling 3 Playpen 0
Chris 4 House 6
Juanita 5 Apt 12
...
Live2 id Attribute
--------- -- -----
House 1 Job
House 2 Car
House 3 Kids
Apt 4 Job
Apt 5 Car
Playpen 6 Diapers
所以如果你有一个' House'然后你总是有一份工作,汽车和孩子。如果你有一个围栏,那么你只有尿布(而且从来没有一个工作)。
我想做的事情(没有重复计算的人)就是找到了House'人(Live =' House',第1类),然后' Job'人(属性='工作',第二类),然后'尿布'因此,汤姆被视为一个“房子”。是一个人,但不是一个' Job'人(因为他之前已被分类,我不想重复计算收入)。
从逻辑上讲,我可以想到几种方法,基于我的研究,这似乎是使用长形式CASE的理想场所,因为我可以从不同的列中指定条件。但是,我似乎无法通过创建太多行来最终加倍计算收入。例如,我将加入它们,它将创建3个Tom条目(Job,Car,Kids各一个)。 IMO要么我们需要多个属性'列(工作,汽车,儿童,尿布各一个)所以'汤姆'仍然在一行或某种方式完全描述,以忽略所有其他的汤姆'一旦他被分类在一个分类中。
答案 0 :(得分:2)
不知道一些额外的细节我猜这是你想要的...表a是一个人在其中表b中有live2在其中
SELECT
SUM(CASE WHEN live = 'House' THEN income ELSE 0 END) as house,
SUM(CASE WHEN live = 'Apt' THEN income ELSE 0 END) as apt,
SUM(CASE WHEN live = 'Playpen' THEN income ELSE 0 END) as playpen
FROM
( SELECT a.*
FROM a
JOIN b ON b.live2 = a.live
GROUP BY a.id
)t
DEMO 这是假设除了房子之外唯一的其他生活是可以找到工作的。如果是这样的话,那么这个查询会做你想要的。
如果您想在查询中实际指定“作业”,那么您可以这样做。
SELECT
SUM(CASE WHEN live = 'House' THEN income ELSE 0 END) as house,
SUM(CASE WHEN attribute = 'Job' AND live2 <> 'House' THEN income ELSE 0 END) as apt,
SUM(CASE WHEN live = 'Playpen' THEN income ELSE 0 END) as playpen
FROM
( SELECT a.*, b.live2, b.attribute
FROM a
JOIN b ON b.live2 = a.live
GROUP BY a.id
)t
你也可以加入指定的每个字段..如果你想要一个例子,我可以告诉你
答案 1 :(得分:1)
你的问题有点奇怪,我同意。没有任何复杂因素,因为没有人住在房子和公寓里......
select live,
sum(income) income,
count(*) people
from p
left join
a
on p.live = a.live2
and a.attribute = 'job'
group by live