在多列上联接2个表,并根据每次联接提取值

时间:2019-10-03 05:32:35

标签: sql apache-spark-sql

我有一张产品和前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的销售额,我将必须在不同的列上将product表与sales表连接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

还有其他联接表以获得所需输出的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以对一个JOIN条件进行单个IN,然后进行条件聚合:

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

答案 1 :(得分:0)

要避免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

相关问题