我有一张产品和前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
还有其他联接表以获得所需输出的方法吗?
答案 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;