【问题标题】:Check the conditions on the rows having same ids in sql server检查sql server中具有相同id的行的条件
【发布时间】:2017-08-08 14:41:10
【问题描述】:

我有一张如下表

Id     |  CompanyName
---    |  ---
100    |  IT
100    |   R&D
100    |   Financial
100    |  Insurance
110    |  IT
110    |  Financial
110    |  Product Based
111    |  R&D
111    |  IT

该表包含类似上述结构的数据,但包含数千个类似的 id

我想找出所有公司名称都是 IT 和 R&D 的所有 ID。如果对于任何 ID,公司名称既不在 IT 也不在 R&D 中,那么不要考虑这些 ID。 例如id 100 不能在此列表中,因为它有额外的公司名称为 Financial,但 id 111 将被考虑,因为所有公司都是 IT 和 R&D

有什么帮助吗?

【问题讨论】:

  • 您使用的是哪个数据库/版本?
  • 我使用的是sql server

标签: sql join


【解决方案1】:
select id,
  sum(case when CompanyName='IT' OR CompanyName='R&D' then 1 else 0 end) as c1
from t
group by id
having count(*)=2 and c1=2

【讨论】:

  • 并不是每个 id 都应该有 IT 和 R&D或研发。因为如果对于任何 id 只有一家公司是 IT,那么您的案例将不起作用,那么它应该起作用。您的案例仅适用于所有公司都应该拥有强制性 IT 和研发,但事实并非如此。所有公司都应该是任何 IT 或研发人员
  • 好的having c1>0应该可以工作或者having count(*)= c1 and count(*)>0
  • 但如果组合是 IT 和 Insurance,则 sum 将为 1,根据 c1>0 将通过,但有另一家公司作为 Insurance,但所有公司都可以是 IT 或 R&D,因此,它会失败。
【解决方案2】:

我会这样做:

select id
from t
having sum(case when CompanyName not in ('IT', 'R&D') then 1 else 0 end) = 0 and
       sum(case when CompanyName in ('IT', 'R&D') then 1 else 0 end) = 2;  -- use "> 0" if you want either one.

注意:这假设您在表中没有重复项。

【讨论】:

    【解决方案3】:
    SELECT DISTINCT Id
    FROM companies
    WHERE 
        Id NOT IN (
            SELECT DISTINCT Id
            FROM companies
            WHERE 
                CompanyName != 'IT'
                AND CompanyName != 'R&D'
        )
    ;
    

    子查询:选择所有记录 - 仅 Id,明显 - CompanyName 不同于“IT”和“R&D”。
    主查询:选择所有记录 - 仅 Id,显然 - 不在先前列表中。
    结果111


    使用选项“MS SQL Server 2014”和架构语法在 sqlfiddle.com 上测试:
    CREATE TABLE companies
        ([Id] int, [CompanyName] varchar(255))
    ;
    
    INSERT INTO companies
        ([Id], [CompanyName])
    VALUES
        (100, 'IT'),
        (100, 'R&D'),
        (100, 'Financial'),
        (100, 'Insurance'),
        (110, 'IT'),
        (110, 'Financial'),
        (110, 'Product Based'),
        (111, 'R&D'),
        (111, 'IT')
    ;
    

    【讨论】:

    • 这正是我所需要的。谢谢。
    • @Ritesh 欢迎您。如果这是您的解决方案,请检查答案为“已接受”(选票下方的绿色 ckeck 标记)。这样其他用户也可以从正确的答案中受益。再见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2016-11-03
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    相关资源
    最近更新 更多