TSQL如何基于另一个值选择值

TSQL如何基于另一个值选择值,sql,tsql,ssms,ssms-2012,Sql,Tsql,Ssms,Ssms 2012,因此,我尝试根据另一列的值选择一个值。例如,在下表的行中,我想选择ID列,在该列中,状态列中没有一个特定值的值为Transfer。因此,对于下面的行,查询只返回DEF值。我不知道该怎么做 ID Status ==== =========== ABCD Received ABCD Transferred XYZ

因此,我尝试根据另一列的值选择一个值。例如,在下表的行中,我想选择ID列,在该列中,状态列中没有一个特定值的值为Transfer。因此,对于下面的行,查询只返回DEF值。我不知道该怎么做

ID                    Status  
====                  ===========
ABCD                  Received    
ABCD                  Transferred    
XYZ                   Received
XYZ                   Transferred
DEF                   Received
试试看

选择不同的id 从您的\u表\u名称 如果不存在,请从您的\u表\u名称中选择id,其中Status='transfer'您可以尝试使用NOT IN

使用的另一个选项不存在


另一种可能的解决办法:

declare @t table (ID varchar(4), Status varchar(11))
insert @t (ID, Status) VALUES 
('ABCD','Received'),
('ABCD','Transferred'),
('XYZ','Received'),
('XYZ','Transferred'),
('DEF','Received')    

select [ID], p.Received, isnull(p.Transferred,0) Transferred
FROM (select id, Status, count(1) cnt from @t group by id, status) t
PIVOT
(
     sum(cnt) for status in (Received,Transferred) 
) AS p
where Transferred is null or Transferred = 0

这样做的好处是使where子句中的所有状态都可用。我怀疑这是迄今为止3个答案中效率最低的一个,但它可能会很有用。

我投票将这个问题作为离题题来结束,因为这不是一个专业和热心程序员的问题。这个人是初学者,需要初学者指导。本-首先,这个问题不是离题。它直接与SQL和TSQL相关。不知道你为什么会认为这是离题的。第二,你表现得好像这是一个无关紧要的问题,事实并非如此。我正在做一个更大的层次的查询,我把它简化得很容易理解别人,并帮助找到一个解决方案。我不会真的认为这是一个小问题,我也不同意本,专业和爱好者不包括初学者。发烧友=我心目中的初学者。然而,我相信Ben只是误解了你的问题,因为不可否认,我甚至花了几次通读才明白,你不仅仅是在寻找一个SELECT*FROM表格,[状态]“转移”了第一页教程的答案。至少有一千个相同的问题,所以不可能找到重复的问题。但不是:问,回答,10分!这个问题就是目前堆栈溢出的所有问题。由于子查询与外部查询不相关,这可能无法像您预期的那样工作。请参阅SQLChao的答案以获取相关的version.Ha。你可能是对的。我的WHERE-id不在,但出于某种原因,我将其编辑为WHERE-NOT-exists。
SELECT DISTINCT id 
FROM yourtable yt1
WHERE NOT EXISTS (SELECT * FROM yourtable yt2 WHERE yt1.id = yt2.id AND Status='Transferred') 
declare @t table (ID varchar(4), Status varchar(11))
insert @t (ID, Status) VALUES 
('ABCD','Received'),
('ABCD','Transferred'),
('XYZ','Received'),
('XYZ','Transferred'),
('DEF','Received')    

select [ID], p.Received, isnull(p.Transferred,0) Transferred
FROM (select id, Status, count(1) cnt from @t group by id, status) t
PIVOT
(
     sum(cnt) for status in (Received,Transferred) 
) AS p
where Transferred is null or Transferred = 0