【问题标题】:Join 2 tables on multiple columns and pull values based on each join在多个列上连接 2 个表并根据每个连接提取值
【发布时间】:2019-10-03 05:32:35
【问题描述】:

我有一张桌子,上面有产品和前 5 名竞争对手 我们有数以千计的产品,竞争对手可能是我们自己产品的一部分

product     comp 1  comp 2  comp 3  comp 4  comp 5
A           B       C       D       E       F

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

Product Sales
A       10
B       20
C       30
D       40
E       50
F       60

为了拉动 comp 1,2,3,4 和 5 的销售额,我必须在不同列上将产品表与销售表连接 5 次,同时将所有这些表组合(联合)在一起时也会出现问题所有竞争对手的销售额必须不同,例如comp1 销售,comp 2 销售,comp 3 销售等等

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

有没有其他方法可以加入表格以获得所需的输出?

【问题讨论】:

  • 产品A有自己的销售数据,与实际销售人员无关,这是什么意思?你能更好地解释一下你的表格设计背后的逻辑吗?
  • 这里的想法是提取产品及其竞争对手的销售数字。我们的产品表中有数千种产品和每个产品的前 5 名竞争对手。跟营业员没关系。 A,B,C,D,E,F 在这种情况下都是项目。
  • 请只标记您感兴趣的RDBMS,而不是全部。
  • sales、Competor 和 Product 是三个不同的表吗?
  • 有 2 个表 - 产品和竞争对手(表 1)和产品销售额(表 2)。我需要将前 5 名竞争对手的销售信息从产品销售表中提取到表 1 中

标签: sql apache-spark-sql


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

      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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 2020-11-29
      • 2018-05-11
      • 2018-05-08
      • 2021-07-22
      • 1970-01-01
      相关资源
      最近更新 更多