从SQL Server中的表中仅选择具有公共状态的行

时间:2017-01-02 09:08:11

标签: sql-server

我的表格如下:

ID CustomerID  AccountNumber StatusID
-------------------------------------
1     300          300100       1
2     300          300200       3
3     300          300300       3
4     400          400100       1
5     400          400200       1
6     500          500100       1

StatusID:

  • 1 =已批准
  • 3 =待定

现在我需要选择帐户已获批准的所有客户(没有待处理的客户),但不会选择其帐户仍未处理的客户。

如果您需要更多详细信息,请告诉我。

7 个答案:

答案 0 :(得分:4)

由客户分组,只接受没有status <> 1

的客户
select customerID
from your_table
group by customerID
having sum(case when status <> 1 then 1 else 0 end) = 0

答案 1 :(得分:3)

使用 HAVING 条款 MAX ,它将为您提供仅具有状态&#34;已批准&#34; = 1

SELECT 
    CustomerID
FROM @tblTest
GROUP BY CustomerID
HAVING MAX(StatusID)=1 

答案 2 :(得分:2)

这是另一种基于提供的样本数据的简单方法

SELECT DISTINCT 
    T.ID, 
    T.CustomerID  , 
    T.AccountNumber , 
    T.StatusID 
FROM 
    Table1 T
INNER JOIN 
    (SELECT CID 
     FROM @Table1 
     WHERE StatusID = 3) TT ON T.CID <> TT.CID

答案 3 :(得分:1)

很容易获得具有待定帐户的所有客户的列表:

select customerID
from your_table
where StatusID = 3

因此只需选择客户不在上面的数据:

select distinct CustomerID
from your_table
where CustomerID not in (select customerID
                         from your_table
                         where StatusID = 3)

distict以避免死刑。)

答案 4 :(得分:0)

第一个答案似乎有效。另一种方法是做这个虽然有点长的

{{1}}

答案 5 :(得分:0)

另一种做法是简单的自我加入。

架构:

CREATE TABLE #TAB (ID INT, CustomerID INT,  AccountNumber VARCHAR(20), StatusID INT)

INSERT INTO #TAB

SELECT 1,300,300100,  1 
UNION ALL
SELECT 2,300,300200,  3
UNION ALL
SELECT 3,300,300300,  3
UNION ALL
SELECT 4,400,400100,  1
UNION ALL
SELECT 5,400,400200,  1
UNION ALL
SELECT 6,500,500100,  1

如下所示进行自我加入,并使用具有待定状态记录的Where子句进行过滤。

SELECT AP.* FROM #TAB AP
LEFT JOIN #TAB P ON AP.CustomerID = p.CustomerID
AND P.StatusID=3 
WHERE AP.StatusID=1
AND P.ID IS NULL

答案 6 :(得分:0)

您可以使用下面的简单查询来获取其帐户已获批准的所有客户

select distinct(customerID) 
from your_table 
where StatusID = 1