Соедините 2 таблицы в нескольких столбцах и извлеките значения на основе каждого объединения - PullRequest
1 голос
/ 03 октября 2019

У меня есть таблица с продуктом и 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

Для того, чтобы вывести продажи для сравнения 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

Есть ли другой способ объединения таблиц для получения желаемого результата?

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вы можете сделать один 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
0 голосов
/ 03 октября 2019

Чтобы избежать 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

...