Select 具有特定列值的所有行的唯一值
Select a unique value throughout all the rows having a particular value for column
我有一个要求,需要获取所有行都有特定值的键的所有不同记录,而不是如果它在其他行中有其他值。
Table结构:
Select TOP (1000)
[Old_Branch_Code]
,[Computer_Name]
,[Migrated]
,[Migration_Date]
FROM [TestDB].[dbo].[ABS_Computer_Details]
所以,如果 table ABS_Computer_Details 包含像
这样的记录
1, 'X', 'SUCCESS','12/12/12'
1, 'Y', 'SUCCESS','12/12/12'
1, 'Z', 'SUCCESS','12/12/12'
1, 'W', 'Failed','12/12/12'
2, 'Y', 'SUCCESS','12/12/12'
2, 'Z', 'SUCCESS','12/12/12'
3, 'Z', 'Failed','12/12/12'
4, 'Z', 'SUCCESS','12/12/12'
所以,它应该 只有 select branch_code = 2 和 branch_code = 4 ;因为 branch_code = 1 和 branch_code = 3 的列之一具有状态 = 'Failed'.
我的尝试:
select Old_Branch_Code from dbo.ABS_Computer_Details
group by Old_Branch_Code,Migrated having Migrated='SUCCESS'
但是,我的查询返回 branch_code = 1、branch_code = 2 和 branch_code = 4 的值。根据我的要求,我应该得到 branch_code = 2 和 branch_code = 4。
题外话:我知道这很微不足道,但我不擅长数据库查询,因为我不是 DBA。
这里的一种方法是在 HAVING
子句中使用条件聚合来检查是否存在除 SUCCESS
以外的任何迁移。如果我们找不到除 SUCCESS
之外的任何其他内容,那么我们将保留该分支代码。
SELECT Old_Branch_Code
FROM dbo.ABS_Computer_Details
GROUP BY Old_Branch_Code
HAVING SUM(CASE WHEN migrated != 'SUCCESS' THEN 1 ELSE 0 END) = 0
请尝试以下...
SELECT Old_Branch_Code,
Computer_Name,
Migration_Date
FROM ABS_Computer_Details
WHERE Old_Branch_Code NOT IN ( SELECT Old_Branch_Code AS failedBranchCode
FROM ABS_Computer_Details
WHERE Migrated = 'FAILED'
GROUP BY Old_Branch_Code
)
ORDER BY Old_Branch_Code,
Computer_Name,
Migration_Date;
此语句首先使用子查询查找 do 的 Migrated
值为 FAILED
的所有 Old_Branch_Code
值的列表与他们有关。
主语句然后选择 Old_Branch_Code
不 属于此列表的每条记录。
如果您有任何问题或意见,请随时post发表相应的评论。
附录
我已经针对使用以下脚本创建的数据库测试了我的代码...
CREATE TABLE ABS_Computer_Details
(
Old_Branch_Code INT,
Computer_Name VARCHAR( 20 ),
Migrated VARCHAR( 20 ),
Migration_Date DATE
);
INSERT INTO ABS_Computer_Details ( Old_Branch_Code,
Computer_Name,
Migrated,
Migration_Date )
VALUES ( 1, 'X', 'SUCCESS', '2012/12/13' ),
( 1, 'Y', 'SUCCESS', '2012/12/13' ),
( 1, 'Z', 'SUCCESS', '2012/12/13' ),
( 1, 'W', 'Failed', '2012/12/13' ),
( 2, 'Y', 'SUCCESS', '2012/12/13' ),
( 2, 'Z', 'SUCCESS', '2012/12/13' ),
( 3, 'Z', 'Failed', '2012/12/13' ),
( 4, 'Z', 'SUCCESS', '2012/12/13' );
您可以过滤记录NOT EXISTS
。您可以按如下方式获取所有列。
SELECT *
FROM dbo.ABS_Computer_Details A
WHERE
NOT EXISTS
(
SELECT 1 FROM dbo.ABS_Computer_Details B
WHERE
B.Old_Branch_Code = A.Old_Branch_Code AND
B.Migrated = 'Failed'
)
我有一个要求,需要获取所有行都有特定值的键的所有不同记录,而不是如果它在其他行中有其他值。
Table结构:
Select TOP (1000)
[Old_Branch_Code]
,[Computer_Name]
,[Migrated]
,[Migration_Date]
FROM [TestDB].[dbo].[ABS_Computer_Details]
所以,如果 table ABS_Computer_Details 包含像
这样的记录 1, 'X', 'SUCCESS','12/12/12'
1, 'Y', 'SUCCESS','12/12/12'
1, 'Z', 'SUCCESS','12/12/12'
1, 'W', 'Failed','12/12/12'
2, 'Y', 'SUCCESS','12/12/12'
2, 'Z', 'SUCCESS','12/12/12'
3, 'Z', 'Failed','12/12/12'
4, 'Z', 'SUCCESS','12/12/12'
所以,它应该 只有 select branch_code = 2 和 branch_code = 4 ;因为 branch_code = 1 和 branch_code = 3 的列之一具有状态 = 'Failed'.
我的尝试:
select Old_Branch_Code from dbo.ABS_Computer_Details
group by Old_Branch_Code,Migrated having Migrated='SUCCESS'
但是,我的查询返回 branch_code = 1、branch_code = 2 和 branch_code = 4 的值。根据我的要求,我应该得到 branch_code = 2 和 branch_code = 4。
题外话:我知道这很微不足道,但我不擅长数据库查询,因为我不是 DBA。
这里的一种方法是在 HAVING
子句中使用条件聚合来检查是否存在除 SUCCESS
以外的任何迁移。如果我们找不到除 SUCCESS
之外的任何其他内容,那么我们将保留该分支代码。
SELECT Old_Branch_Code
FROM dbo.ABS_Computer_Details
GROUP BY Old_Branch_Code
HAVING SUM(CASE WHEN migrated != 'SUCCESS' THEN 1 ELSE 0 END) = 0
请尝试以下...
SELECT Old_Branch_Code,
Computer_Name,
Migration_Date
FROM ABS_Computer_Details
WHERE Old_Branch_Code NOT IN ( SELECT Old_Branch_Code AS failedBranchCode
FROM ABS_Computer_Details
WHERE Migrated = 'FAILED'
GROUP BY Old_Branch_Code
)
ORDER BY Old_Branch_Code,
Computer_Name,
Migration_Date;
此语句首先使用子查询查找 do 的 Migrated
值为 FAILED
的所有 Old_Branch_Code
值的列表与他们有关。
主语句然后选择 Old_Branch_Code
不 属于此列表的每条记录。
如果您有任何问题或意见,请随时post发表相应的评论。
附录
我已经针对使用以下脚本创建的数据库测试了我的代码...
CREATE TABLE ABS_Computer_Details
(
Old_Branch_Code INT,
Computer_Name VARCHAR( 20 ),
Migrated VARCHAR( 20 ),
Migration_Date DATE
);
INSERT INTO ABS_Computer_Details ( Old_Branch_Code,
Computer_Name,
Migrated,
Migration_Date )
VALUES ( 1, 'X', 'SUCCESS', '2012/12/13' ),
( 1, 'Y', 'SUCCESS', '2012/12/13' ),
( 1, 'Z', 'SUCCESS', '2012/12/13' ),
( 1, 'W', 'Failed', '2012/12/13' ),
( 2, 'Y', 'SUCCESS', '2012/12/13' ),
( 2, 'Z', 'SUCCESS', '2012/12/13' ),
( 3, 'Z', 'Failed', '2012/12/13' ),
( 4, 'Z', 'SUCCESS', '2012/12/13' );
您可以过滤记录NOT EXISTS
。您可以按如下方式获取所有列。
SELECT *
FROM dbo.ABS_Computer_Details A
WHERE
NOT EXISTS
(
SELECT 1 FROM dbo.ABS_Computer_Details B
WHERE
B.Old_Branch_Code = A.Old_Branch_Code AND
B.Migrated = 'Failed'
)