我无法理解您的问题!
请确认我的解释,然后考虑我的回答
您在 tableBA 中有此示例数据
BUSINESS Address < notice I call this BUSINESS not company
A 1
A 2
B 1
C 3
D 4 < I have added four businesses sharing the same address
E 4
F 4
G 4
X 5 < X does not share an address with any other businesses
X 6 but it does operate at multiple addresses
您确实需要澄清您希望如何处理上述情况。
有些公司在同一个地址拥有多家企业。我假设可能有两个以上的企业共享地址的情况,尽管在您的示例数据中并非如此。
如果没有其他企业在经营企业使用的任何地址,我们可以使用企业名称作为公司名称。 (如上面的 C 所示)。请注意,A 在地址 2 中单独运行,但由于它与 B 共享地址,因此不能包含在内。
如果许多企业在同一个地址运营,则通过将它们连接在一起(逗号分隔)将它们的所有企业名称用作公司名称。
上面创建的每个“公司名称”都应该只列出一次,比如这样
A, B
C
我的回答
按地址排序上述数据,然后按公司名称排序:
Data Resulting text wanted
1, A A, B
1, B
2, A NONE
3, C C
4, D D,E,F,G
4, E
4, F
4, G
5, X X
6, X
可能会出现以下情况,怎么办?即 P 与另外两家公司共享两个不同的地址
7, O
7, P
8, P
b, Q
第 1 部分。获得“C”和“X”
SELECT Tab1.address, Tab1.Business
FROM tableBA AS Tab1
WHERE NOT EXISTS
(
SELECT 1
FROM tableBA AS Tab2
WHERE Tab2.Business <> Tab1.Business
AND Tab2.Address IN (SELECT Address
FROM tableBA AS Tab3
WHERE tab3.Business = Tab1.Business)
)
GROUP BY Tab1.Business
仅当 Tab1 中的商家在其任何地址都没有其他商家时,EXISTS 子句才返回 true。
第 2 部分. 得到 "A, B" 和 "D,E,F,G"
SELECT Address, Business
FROM tableBA
INNER JOIN
(
SELECT Address
FROM tableBA
GROUP BY Address
HAVING COUNT (*)>1
) As Tab1
ON tableBA.Address = Tab1.Address
子查询只返回多个业务使用的地址,并限制返回的行数。
您现在需要“透视”结果,以便每个地址只有一行,所有公司名称作为列。
您可以通过多种方式使用代码执行此操作,我可能会使用记录集来打开上述第 2 部分的查询并遍历所有附加到字符串的行。
使用第 1 部分和第 2 部分的结果
结果字符串列表的存储位置是另一回事,听起来您想将其写入表以供以后使用。
我会将第 2 部分中提到的记录集基于第 1 部分和第 2 部分联合在一起的查询。
即
SELECT ... ie the part 1 query
UNION
SELECT ... ie the part 2 query
同时处理所有行,可能会将结果列表插入到表中。
就我个人而言,我发现这种方法比使用字典对象更直接,因为它允许您使用 SQL 来查看正在处理和创建的记录。