根据SQL中的条件获取特定记录

时间:2019-12-30 11:25:47

标签: sql sql-server

我的要求是从 SQL表中获取缺少状态的ID。我将获得每个ID的状态列表,例如 A,B,C,D 。在一种情况下,我必须检查状态 B 是否存在。表格每天都会更新,每次创建新ID时都会

条件

  1. 如果状态为 A ,而其他状态(如 C和D )不存在 存在,则无需获取ID。
  2. 如果状态 A B 存在,而其他状态(例如 C或D )不存在,则无需获取ID 。
  3. 如果状态 A 存在而 B 不存在,则其他 状态,例如 C或D ,那么我应该获取该ID 记录
  4. 如果状态为 A B ,则其他 状态,例如 C或D 存在(所有状态都存在),那么我不需要获取该ID 记录
    Table1:  
    Id StatusCode  
    1    A   
    1    C    
    2    A    
    2    B     
    2    C    
    3    A    
    3    C     
    3    D  

如何使用SQL查询获取ID 1和3 ?,似乎很简单,但由于我是SQL新手,所以无法在SQL中获取它。

enter image description here

当只有一个ID时,此屏幕快照中的

select语句可以正常工作,而在多个ID上失败。我尝试了许多其他方式,但没有用

4 个答案:

答案 0 :(得分:2)

尝试一下

SELECT DISTINCT ID 
FROM T1
WHERE Statuscode = 'A' AND ID NOT IN (SELECT ID FROM T1 WHERE Statuscode = 'B' )
AND  (ID IN (SELECT ID FROM T1 WHERE Statuscode = 'C' ) OR ID IN (SELECT ID FROM T1 WHERE Statuscode = 'D' ))

FIDDLE DEMO

此外,要更正Gordon Linoff's答案,我们需要在其中的条件处再添加一个

SELECT Id
FROM T1
GROUP BY Id
HAVING SUM(CASE WHEN Statuscode = 'A' THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN Statuscode = 'B' THEN 1 ELSE 0 END) = 0 AND
       SUM(CASE WHEN Statuscode IN ('C', 'D') THEN 1 ELSE 0 END) > 0;

FIDDLE DEMO

答案 1 :(得分:1)

这回答了问题的原始版本。

我认为您可以使用聚合:

select id
from t
group by id
having sum(case when status = 'A' then 1 else 0 end) > 0 and
       sum(case when status in ('C', 'D') then 1 else 0 end) > 0;

答案 2 :(得分:0)

import requests
from bs4 import BeautifulSoup


result = []
page = 0
while True:
    page += 1
    print(f"Extracting Page# {page}")
    with requests.Session() as req:
        r = req.get(
            f"https://www.kununu.com/de/volkswagen/bewerbung/{page}")
        soup = BeautifulSoup(r.text, 'html.parser')
        if r.status_code == 200:
            for item in soup.findAll("div", {'class': 'review-details user-content hidden-xs'}):
                data = [div.get_text(strip=True)
                        for div in item.findAll("div")]
                if '2010' in data:
                    exit()
                else:
                    if data not in result:
                        result.append(data)

for what in result:
    print(what)

答案 3 :(得分:0)

SELECT id
FROM t
GROUP BY
    Id
HAVING MAX(status) = CHAR(64 + COUNT(*))
--char(64+1) = A, char(64+2) = B etc

其背后的逻辑是,它将全部计数相同类型的id。因此,如果您有3行,则需要abc。如果您的ID有4行,那么您将拥有ABCD。通常,最大状态应始终与行数相同。

如果您在ID和状态代码之间没有重复,这当然是正确的。