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

MySQL通过创建更多的列而不是行来连接表,mysql,sql,join,case,mysql-workbench,Mysql,Sql,Join,Case,Mysql Workbench,我对SQL基本上是新手,遇到了一个我无法理解的情况。假设我有两张桌子:P和A Person id Live Income --------- -- ---- ------ Tom 1 House 10 Sarah 2 Apt 7 Sterling 3 Playpen 0 Chris 4 House 6 Juanit

我对SQL基本上是新手,遇到了一个我无法理解的情况。假设我有两张桌子: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
所以,如果你有房子,那么你总是有工作、车和孩子。如果你有玩具笔,那么你只有尿布,没有工作

在不重复计算人数的情况下,我要做的是找到“住房子的人”的总收入,第一类,然后是“工作”的人,第二类,然后是“尿布”的人,等等,所以汤姆被算作“家庭”人,而不是“工作”人,因为他以前被分类过,我不想重复计算收入

从逻辑上讲,我可以想出几种方法,根据我的研究,这似乎是一个使用长格式案例的完美地方,因为我可以从不同的列中指定条件。但是,我似乎无法以一种不会因为创建太多行而重复计算收入的方式加入表格。例如,我将加入他们,它将创建3个Tom条目,分别针对Job、Car和Kids。
在我看来,要么我们需要多个“属性”列,每个列对应于工作、汽车、孩子、尿布,因此“汤姆”仍然在一行上有完整的描述,要么以某种方式忽略所有其他“汤姆”行,一旦他被计入分类中

在不知道其他细节的情况下,我猜这就是你想要的。。。表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
这是假设的,除了房子之外,唯一能找到工作的人也住在这里。如果是这种情况,那么这个查询将满足您的要求

如果您想在查询中实际指定“Job”,那么您可以这样做

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

您还可以使用指定的每个字段进行联接。。如果你想要一个例子,我可以给你看

你的问题有点奇怪,我同意。没有任何复杂的情况,因为你的人都不住在房子和公寓里

select live, 
       sum(income) income, 
       count(*) people 
from p 
     left join 
     a 
      on p.live = a.live2 
         and a.attribute = 'job' 
group by live

你做了什么尝试?你只能在现场参加吗?或者你能用这个属性吗?我知道很多人的房子没有工作也没有车……这是我贴出的问题的一个很好的答案。我的实际表有点复杂,所以我最终使用GROUP_CONCAT将所有属性收集为一列,将其连接到Person,然后使用CASE via LIKE和我正在搜索的属性的关键字,以防其他人有类似问题