【问题标题】:Show fields only when other column does not contain nulls仅当其他列不包含空值时才显示字段
【发布时间】:2021-05-23 14:38:58
【问题描述】:

我有一张桌子,可以存放宠物和一定数量的疫苗。一栏是标识符,另一栏是疫苗名称,第三栏是完成日期。如果日期为空,则表示宠物尚未接种该疫苗。

这个结构是下一个:

CREATE TABLE pets (
  pet VARCHAR (10), 
  vaccine VARCHAR (50), 
  complete_date DATE
);

INSERT INTO pets VALUES ('DOG001', 'Adenovirus', '2021-01-03');
INSERT INTO pets VALUES ('DOG001', 'Parvovirus', '2021-02-03');
INSERT INTO pets VALUES ('DOG001', 'Leptospirosis', null);
INSERT INTO pets VALUES ('CAT774', 'Calcivirosis', '2021-01-06');
INSERT INTO pets VALUES ('CAT774', 'Panleukopenia', null);
INSERT INTO pets VALUES ('DOG002', 'Adenovirus', '2020-12-21');
INSERT INTO pets VALUES ('DOG002', 'Parvovirus', '2021-02-01');
INSERT INTO pets VALUES ('DOG002', 'Leptospirosis', '2021-03-01');
pet vaccine complete_date
DOG001 Adenovirus 2021-01-03
DOG001 Parvovirus 2021-02-03
DOG001 Leptospirosis null
CAT774 Calcivirosis 2021-01-06
CAT774 Panleukopenia null
DOG002 Adenovirus 2020-12-21
DOG002 Parvovirus 2021-02-01
DOG002 Leptospirosis 2021-03-01

考虑到所有疫苗,我需要一份所有“日期”不为空的宠物的列表。

在本例中,结果应该是简单的“DOG002”,因为它是唯一一个所有日期都具有非空值的动物。

【问题讨论】:

  • SELECT pet FROM pets WHERE complete_date IS NOT NULL EXCEPT SELECT pet FROM pets WHERE complete_date IS NULL 是一种方法,但不一定是最明显或最有效的方法。

标签: sql sql-server tsql


【解决方案1】:

HAVING 中的条件聚合是一种方法:

SELECT Pet
FROM dbo.Pets
GROUP BY Pet
HAVING COUNT(CASE WHEN Complete_Date IS NULL THEN 1 END) = 0;

【讨论】:

    【解决方案2】:

    CTE也可以达到上述效果

    with CTE as 
    (
     select pet,
     vaccine,
     complete_date,
     SUM(IIF(complete_date is null ,1,0)) over (PARTITION BY pet) as pet_flag  
     from pets
    )
    
    select distinct Pet from CTE where
    pet_flag = 0 
    

    【讨论】:

    • 烦人,但; 是一个声明终结者而不是“开始者”。它位于 all 您的语句的末尾,而不是需要正确终止 prior 语句的开头。
    • 是的,没错@Larnu - 我现在已经更正了
    【解决方案3】:

    我认为 Larnu 发布了您要查找的内容 (+1)...但是...以防万一您想查看宠物的详细信息。

    另一个选项是WITH TIES

    Select top 1 with ties *
     From  pets
     order by sum(case when complete_date is null then 1 else 0 end) over (partition by pet)
    

    【讨论】:

      【解决方案4】:
      SELECT DISTINCT Pet FROM Pets 
      WHERE Pet NOT IN (SELECT Pet FROM Pets WHERE Complete_Date IS NULL)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-29
        • 2016-01-19
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        • 2018-12-10
        • 1970-01-01
        • 2013-08-31
        相关资源
        最近更新 更多