我有以下MS-Access表:
╔═══════════╦══════════════╗
║ colPartNo ║ colOperation ║
╠═══════════╬══════════════╣
║ 1 ║ A ║
╠═══════════╬══════════════╣
║ 1 ║ B ║
╠═══════════╬══════════════╣
║ 1 ║ C ║
╠═══════════╬══════════════╣
║ 2 ║ B ║
╠═══════════╬══════════════╣
║ 2 ║ C ║
╠═══════════╬══════════════╣
║ 3 ║ C ║
╠═══════════╬══════════════╣
║ 3 ║ D ║
╠═══════════╬══════════════╣
║ 3 ║ E ║
╠═══════════╬══════════════╣
║ 4 ║ A ║
╠═══════════╬══════════════╣
║ 4 ║ B ║
╠═══════════╬══════════════╣
║ 4 ║ C ║
╠═══════════╬══════════════╣
║ 4 ║ D ║
╠═══════════╬══════════════╣
║ 5 ║ A ║
╠═══════════╬══════════════╣
║ 5 ║ B ║
╠═══════════╬══════════════╣
║ 5 ║ C ║
╠═══════════╬══════════════╣
║ 6 ║ B ║
╠═══════════╬══════════════╣
║ 6 ║ C ║
╚═══════════╩══════════════╝
我要做的事情似乎无法解决,是返回一个仅包含不同零件号的数据集,其中零件号具有操作A,B和C。零件号可能还有其他操作,但必须同时具备这三个功能。我可以使用下面的语句获得零件编号的明确列表,但其中包括没有全部三个操作的零件:
SELECT DISTINCT tblPart_Info.Part_No, tblPart_Info.Operation
FROM tblPart_Info
WHERE (((tblPart_Info.Operation)="A" Or (tblPart_Info.Operation)="B" Or (tblPart_Info.Operation)="C"))
ORDER BY tblPart_Info.Part_No;
我想要获取的数据集将是零件编号1、4和5
答案 0 :(得分:3)
您可以在having
子句中使用条件聚合来做到这一点:
SELECT pi.Part_No, tblPart_Info.Operation
FROM tblPart_Info as pi
GROUP BY pi.Part_No
HAVING SUM(IIF(pi.Operation = "A", 1, 0)) > 0 AND
SUM(IIF(pi.Operation = "B", 1, 0)) > 0 AND
SUM(IIF(pi.Operation = "C", 1, 0)) > 0;
这将返回部件号。如果要原始行,请使用JOIN
,IN
或EXISTS
将其连接到原始表。