SQL 复杂联接的 Pivot
SQL PIvot for a complex join
我有一个 table 可以捕获经理的名称值组。因此,例如,id 为 1 的经理有两个组值对:location=dublin 和 dept=sales.
GROUP
VALUE
MANAGERID
LOCATION
DUBLIN
1
DEPT
SALES
1
LOCATION
OSLO
2
DEPT
SALES
2
LOCATION
LONDON
3
DEPT
SALES
3
我有另一个 table 有员工分组...
GROUP
VALUE
EMPLOYEEID
LOCATION
DUBLIN
101
DEPT
SALES
101
LOCATION
DUBLIN
102
DEPT
SALES
102
LOCATION
DUBLIN
103
DEPT
SALES
103
SHOESIZE
15
103
LOCATION
OSLO
104
DEPT
SALES
104
我想获得至少与特定经理具有相同分组的所有员工的列表。因此,例如,id 为 1 的经理是 location=dublin 和 dept=sales,具有这些组值的员工至少是 101,102 和 103,但不是 104。
我事先不知道组列或值列的值。如果我对 group 和 value 列进行简单的内部连接,然后进行不同的连接,我会得到 101、102、103 和 104
有什么想法吗?
您可以通过 CROSS
连接表和条件聚合来实现:
SELECT e.EMPLOYEEID
FROM managers m CROSS JOIN employees e
WHERE m.MANAGERID = 1
GROUP BY e.EMPLOYEEID
HAVING COUNT(DISTINCT m."GROUP") =
COUNT(CASE WHEN e."GROUP" = m."GROUP" AND e."VALUE" = m."VALUE" THEN 1 END)
参见demo。
结果:
EMPLOYEEID
101
102
103
我有一个 table 可以捕获经理的名称值组。因此,例如,id 为 1 的经理有两个组值对:location=dublin 和 dept=sales.
GROUP | VALUE | MANAGERID |
---|---|---|
LOCATION | DUBLIN | 1 |
DEPT | SALES | 1 |
LOCATION | OSLO | 2 |
DEPT | SALES | 2 |
LOCATION | LONDON | 3 |
DEPT | SALES | 3 |
我有另一个 table 有员工分组...
GROUP | VALUE | EMPLOYEEID |
---|---|---|
LOCATION | DUBLIN | 101 |
DEPT | SALES | 101 |
LOCATION | DUBLIN | 102 |
DEPT | SALES | 102 |
LOCATION | DUBLIN | 103 |
DEPT | SALES | 103 |
SHOESIZE | 15 | 103 |
LOCATION | OSLO | 104 |
DEPT | SALES | 104 |
我想获得至少与特定经理具有相同分组的所有员工的列表。因此,例如,id 为 1 的经理是 location=dublin 和 dept=sales,具有这些组值的员工至少是 101,102 和 103,但不是 104。
我事先不知道组列或值列的值。如果我对 group 和 value 列进行简单的内部连接,然后进行不同的连接,我会得到 101、102、103 和 104
有什么想法吗?
您可以通过 CROSS
连接表和条件聚合来实现:
SELECT e.EMPLOYEEID
FROM managers m CROSS JOIN employees e
WHERE m.MANAGERID = 1
GROUP BY e.EMPLOYEEID
HAVING COUNT(DISTINCT m."GROUP") =
COUNT(CASE WHEN e."GROUP" = m."GROUP" AND e."VALUE" = m."VALUE" THEN 1 END)
参见demo。
结果:
EMPLOYEEID |
---|
101 |
102 |
103 |