MySQL通过创建更多列而不是行来连接表

时间:2014-09-08 18:36:50

标签: mysql sql join case mysql-workbench

我几乎是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要么我们需要多个属性'列(工作,汽车,儿童,尿布各一个)所以'汤姆'仍然在一行或某种方式完全描述,以忽略所有其他的汤姆'一旦他被分类在一个分类中。

2 个答案:

答案 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