计算唯一记录所需的查询帮助
Count query help needed with unique records
我有以下数据结构,我试图找到唯一 ID,其中值 Alphabets 值 等于 到 A 和 B(即 select ID = 1,但不是 ID = 3 或 5)。
并找到唯一 ID,其中值 Alphabets 值包含 Both A 和 B(即 select ID = 1、3 和 5)。
╔═══╦════════════╦═════════════╗
║ ║ ID ║ Alphabets ║
╠═══╬════════════╬═════════════╣
║ 1 ║ 1 ║ A ║
║ 1 ║ 1 ║ B ║
║ 4 ║ 2 ║ B ║
║ 5 ║ 2 ║ D ║
║ 6 ║ 3 ║ A ║
║ 7 ║ 3 ║ B ║
║ 8 ║ 3 ║ D ║
║ 9 ║ 4 ║ A ║
║ 10║ 4 ║ C ║
║ 11║ 5 ║ A ║
║ 12║ 5 ║ B ║
║ 13║ 5 ║ C ║
║ 14║ 5 ║ D ║
╚═══╩════════════╩═════════════╝
CREATE TABLE dbo.Alphabets(
ID int NOT NULL
,Alphabets char(1) NOT NULL
,CONSTRAINT PK_Alphabets PRIMARY KEY (ID, Alphabets)
);
INSERT INTO dbo.Alphabets VALUES
(1, 'A')
,(1, 'B')
,(2, 'B')
,(2, 'D')
,(3, 'A')
,(3, 'B')
,(3, 'D')
,(4, 'A')
,(4, 'C')
,(5, 'A')
,(5, 'B')
,(5, 'C')
,(5, 'D');
应该这样做:
SELECT ID
FROM Alphabets
WHERE Alphabets IN ('A','B')
EXCEPT
SELECT ID
FROM Alphabets
WHERE Alphabets NOT IN ('A','B')
还有许多其他方法可以完成任务,但这是最简单的方法之一。
一个更晦涩(但更有效)的单次解决方案使用聚合和 CASE 表达式:
SELECT ID
FROM Alphabets
GROUP BY ID
HAVING MAX(CASE WHEN Alphabets IN ('A','B') THEN 0 ELSE 1 END) = 0
我有以下数据结构,我试图找到唯一 ID,其中值 Alphabets 值 等于 到 A 和 B(即 select ID = 1,但不是 ID = 3 或 5)。 并找到唯一 ID,其中值 Alphabets 值包含 Both A 和 B(即 select ID = 1、3 和 5)。
╔═══╦════════════╦═════════════╗
║ ║ ID ║ Alphabets ║
╠═══╬════════════╬═════════════╣
║ 1 ║ 1 ║ A ║
║ 1 ║ 1 ║ B ║
║ 4 ║ 2 ║ B ║
║ 5 ║ 2 ║ D ║
║ 6 ║ 3 ║ A ║
║ 7 ║ 3 ║ B ║
║ 8 ║ 3 ║ D ║
║ 9 ║ 4 ║ A ║
║ 10║ 4 ║ C ║
║ 11║ 5 ║ A ║
║ 12║ 5 ║ B ║
║ 13║ 5 ║ C ║
║ 14║ 5 ║ D ║
╚═══╩════════════╩═════════════╝
CREATE TABLE dbo.Alphabets(
ID int NOT NULL
,Alphabets char(1) NOT NULL
,CONSTRAINT PK_Alphabets PRIMARY KEY (ID, Alphabets)
);
INSERT INTO dbo.Alphabets VALUES
(1, 'A')
,(1, 'B')
,(2, 'B')
,(2, 'D')
,(3, 'A')
,(3, 'B')
,(3, 'D')
,(4, 'A')
,(4, 'C')
,(5, 'A')
,(5, 'B')
,(5, 'C')
,(5, 'D');
应该这样做:
SELECT ID
FROM Alphabets
WHERE Alphabets IN ('A','B')
EXCEPT
SELECT ID
FROM Alphabets
WHERE Alphabets NOT IN ('A','B')
还有许多其他方法可以完成任务,但这是最简单的方法之一。
一个更晦涩(但更有效)的单次解决方案使用聚合和 CASE 表达式:
SELECT ID
FROM Alphabets
GROUP BY ID
HAVING MAX(CASE WHEN Alphabets IN ('A','B') THEN 0 ELSE 1 END) = 0