gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:21:03 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com