首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接多个列上的两个表,并根据每个连接拉取值

连接多个列上的两个表,并根据每个连接拉取值
EN

Stack Overflow用户
提问于 2019-10-03 13:32:35
回答 2查看 64关注 0票数 1

我有一个表,上面有产品和前5名竞争对手,我们有数千种产品,竞争对手可能是我们自己产品的一部分。

代码语言:javascript
复制
product     comp 1  comp 2  comp 3  comp 4  comp 5
A           B       C       D       E       F

我需要为每个竞争对手提取他们的销售价值

代码语言:javascript
复制
Product Sales
A       10
B       20
C       30
D       40
E       50
F       60

为了拉取comp 1、2、3、4和5的销售额,我必须在不同的列上将product表与sales表连接5次,并且在合并(联合)所有这些表时也会出现问题,因为所有竞争对手的销售额必须不同,例如comp1 sales、Comp2 sales、Comp3 sales等等

代码语言:javascript
复制
product comp 1 comp 2 comp 3 comp 4 comp 5 comp 1 sales comp 2 sales comp 3 sales comp 4 sales  comp 5 sales
A   B   C   D   E   F   20  30  40  50  60

有没有其他方法可以连接这些表以获得所需的输出?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-03 15:44:17

您可以使用IN条件执行单个JOIN,然后执行条件聚合:

代码语言:javascript
复制
SELECT
    p.product,
    p.comp1,
    p.comp2,
    p.comp3,
    p.comp4,
    p.comp5,
    MAX(CASE WHEN s.product = p.comp1 THEN s.sales END) comp1sales,
    MAX(CASE WHEN s.product = p.comp2 THEN s.sales END) comp2sales,
    MAX(CASE WHEN s.product = p.comp3 THEN s.sales END) comp3sales,
    MAX(CASE WHEN s.product = p.comp4 THEN s.sales END) comp4sales,
    MAX(CASE WHEN s.product = p.comp5 THEN s.sales END) comp5sales
FROM product p
INNER JOIN sales s 
    ON s.product IN (p.comp1, p.comp2, p.comp3, p.comp4, p.comp5)
GROUP BY
    p.product,
    p.comp1,
    p.comp2,
    p.comp3,
    p.comp4,
    p.comp5
票数 0
EN

Stack Overflow用户

发布于 2019-10-03 14:30:47

为了避免5次连接,您可以使用UNION将列转换为行:

代码语言:javascript
复制
  SELECT
     p.product,
     p.comp
    FROM(
    SELECT
     p.product,
     compA AS comp
    FROM(
    -- this is your product table
    SELECT '1' AS product, 'A' AS compA, 'B' AS compB, 'C' AS compC
    UNION ALL
    SELECT '2' AS product, 'E' AS compA, 'F' AS compB, 'G' AS compC
    )p

    UNION ALL

    SELECT
     p.product,
     compB AS comp
    FROM(
    -- this is your product table
    SELECT '1' AS product, 'A' AS compA, 'B' AS compB, 'C' AS compC
    UNION ALL
    SELECT '2' AS product, 'E' AS compA, 'F' AS compB, 'G' AS compC
    )p

    UNION ALL

    SELECT
     p.product,
     compC AS comp
   FROM(
    -- this is your product table
    SELECT '1' AS product, 'A' AS compA, 'B' AS compB, 'C' AS compC
    UNION ALL
    SELECT '2' AS product, 'E' AS compA, 'F' AS compB, 'G' AS compC
    )p

) p
INNER JOIN (
    -- Sales table
    SELECT 'A' as comp
    UNION ALL
    SELECT 'B' as comp
    UNION ALL
    SELECT 'C' as comp
    UNION ALL
    SELECT 'D' as comp
    UNION ALL
    SELECT 'E' as comp
    UNION ALL
    SELECT 'F' as comp
    UNION ALL
    SELECT 'G' as comp
) sales ON p.comp = sales.comp;

http://sqlfiddle.com/#!9/9eecb/109833

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58212860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档