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

标签 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

因此,如果您有“房子”,那么您总是会有工作、汽车和 child 。如果你有婴儿围栏,那么你只有尿布(而不是工作)。

我想做的(不重复计算人数)是找到“家庭”人(Live='House',第一类)的总收入,然后是“工作”人(Attribute='工作”,第二类),然后是“尿布”人,等等。所以汤姆被算作“家庭”人而不是“工作”人(因为他之前已被分类,我不想重复计算收入).

从逻辑上讲,我可以想到几种处理方法,并且根据我的研究,这似乎是使用 CASE 的长格式的完美场所,因为我可以从不同的列中指定条件。但是,我似乎无法以一种不会因创建太多行而最终重复计算收入的方式加入表格。例如,我将加入他们,它将创建 3 个 Tom 条目(Job、Car、Kids 各一个)。 IMO 要么我们需要多个“属性”列(工作、汽车、 child 、尿布各一个),这样“汤姆”仍然在一行中得到完整描述,或者在他被计算在内后以某种方式忽略所有其他“汤姆”行一个分类。

最佳答案

在不知道一些额外细节的情况下,我猜这就是你想要的...表 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

你也可以加入指定的每个字段..如果你想要一个例子我可以给你看

关于MySQL 通过创建更多列而不是行来连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25730888/

相关文章:

postgresql - 如何选择带左外连接的最小 UUID?

mysql - Order by 下划线作为最高排序优先级

mysql - 如何将我的应用程序与部署在 Oracle 云基础架构上的 VM 实例上的 MySQL 企业数据库镜像连接起来?

c# - sqlDecimal 到十进制 clr 存储过程无法将类型 'System.Data.SqlTypes.SqlDecimal' 的对象转换为类型 'System.IConvertible'

sql - 选择不同的值计数 laravel

mysql - 为什么 STRAIGHT_JOIN 如此大幅度地改进了这个查询,当它写在 SELECT 关键字之后是什么意思?

mysql - 比较 2 个 MySQL 表

mysql - 如何根据对表 X 的查询结果返回表 Y 的行?

mysql - 如何使用SQL删除条件下字符串内的空格?

join - Doctrine orm 计数 1 :n relationship on join