我有一个电话表制作
factory_id | factory_name | product_id
1 | A | 1
1 | A | 2
1 | A | 3
2 | B | 3
3 | C | 1
3 | C | 2
3 | C | 3
3 | C | 4
3 | C | 5
我正在尝试开发一个查询,该查询将返回两个工厂名称对,这样factory1的每个产品都由factory2生产,结果如下:
factory_name_1 | factory_name_2
A | C
B | A
B | C
我有一些嵌套的自联接和重命名,但是我无法确定如何针对这种情况应用EXISTS
或IN
,这种情况“对于工厂X生产的每个产品都可以健康)状况”。感谢高级的帮助。
更新: 抱歉我忘了粘贴查询:
select t0.fname0, t1.fname1
from (
select factory_id as fid0, factory_name as fname0, product_id as pid0, count(distinct factory_id, product_id) as pnum0
from production
group by factory_id
) t0
join
(
select factory_id as fid1, factory_name as fname1, product_id as pid1, count(distinct factory_id, product_id) as pnum1
from production
group by factory_id
) t1
where t0.fid0 <> t1.fid1
and t0.pnum0 < t1.pnum1
and t0.pid0 = t1.pid1;
更新2:生产是唯一的表格。预期的输出factory1和factory2只是factory_name属性的重命名。
答案 0 :(得分:2)
您需要为每个工厂配对使用JOIN
表,以确保它们“联接”在相同的product_id
上,否则可能会导致DISTINCT product_id
的计数相似但这些不一定指的是相同 product_id
。
这是我的看法:
SELECT bfna,afna, pcnt FROM (
SELECT a.factory_name afna, b.factory_name bfna, COUNT(DISTINCT b.product_id) commoncnt
FROM tbl a LEFT JOIN tbl b ON b.factory_name!=a.factory_name AND b.product_id=a.product_id
GROUP BY a.factory_name, b.factory_name
) c
INNER JOIN (
SELECT factory_name fna, COUNT(DISTINCT product_id) pcnt
FROM TBL GROUP BY factory_name
) d ON fna=bfna AND commoncnt=pcnt
ORDER BY bfna,afna
您可以在此处找到一个演示:https://rextester.com/JJGCK84904
它产生:
bfna afna commoncnt
A C 3
B A 1
B C 1
为简单起见,我省略了列factory_id
,因为它在此处未添加任何信息。
有趣的事实:由于我仅使用“裸骨” SQL表达式,因此上面的代码也可以在SQL Server上运行,而无需进行任何更改。
答案 1 :(得分:1)
您可以这样操作:
SUM(VALUE) as sumOfValues
输出:
select A as factory_name_1 , B as factory_name_2
from
(
select A, B, count(*) as Count_
from
(
select a.factory_name as A, b.factory_name as B
from yourtable a
inner join yourtable b
on a.product_id = b.product_id and a.factory_id <> b.factory_id
)a group by A, B
)a
inner join
(select factory_name, count(*) as Count_ from yourtable group by factory_name) b
on a.A = b.factory_name and a.Count_ = b.Count_
Order by 1
答案 2 :(得分:0)
其他解决方案似乎比必要的更为复杂。这基本上是一个带有聚合的自联接:
with t as (
select t.*, count(*) over (partition by factory_id) as cnt
from tbl t
)
select t1.factory_id, t2.factory_id, t1.factory_name, t2.factory_name, count(*)
from t t1 join
t t2
on t1.product_id = t2.product_id and t1.factory_id <> t2.factory_id
group by t1.factory_id, t2.factory_id, t1.factory_name, t2.factory_name, t1.cnt
having count(*) = max(t1.cnt);
Here是db <>小提琴。