如何将查询结果合并到新表的列中

时间:2019-06-12 12:48:47

标签: sql

我有一个日期列表,我正在尝试查找过期/接近过期和确定日期的数量,并建立一个显示这些日期的新表。

对我来说,最简单的方法是简单地查询数据库三遍,并在我的应用程序中构建预期的结果。我只是想知道SQL是否会更干净。

我只设法产生了三个不同的正确结果,但是我需要最终结果在它自己的表中。

我有一个SQLFiddle显示到目前为止我已做的事情 http://www.sqlfiddle.com/#!18/c7b1a/1

我的桌子是

CREATE TABLE certificates (
    ValidTo DATETIME
);

数据是

INSERT INTO certificates (ValidTo) VALUES ('2019-05-12') -- expired
INSERT INTO certificates (ValidTo) VALUES ('2019-06-20') -- due
INSERT INTO certificates (ValidTo) VALUES ('2019-06-25') -- due
INSERT INTO certificates (ValidTo) VALUES ('2020-01-25') -- ok
INSERT INTO certificates (ValidTo) VALUES ('2020-03-25') -- ok
INSERT INTO certificates (ValidTo) VALUES ('2020-03-05') -- ok

到目前为止我提出的SQL是

select count(*) [Expired] from certificates where ValidTo < '2019-06-12'
GO
select count(*) [Due] from certificates where ValidTo >= '2019-06-12' and ValidTo <= '2019-07-12'
GO
select count(*) [OK] from certificates where ValidTo > '2019-07-12'

但是,这显然将显示三个单独的结果。

理想情况下,我希望每个结果都在新表的一列中

我的预期结果是

Expired   Due   OK
1         2     3

已过期= 1,因为第一个SQL查询返回1

Where Due = 2,因为第二个SQL查询返回2

OK = 3,因为第三个SQL查询返回3

2 个答案:

答案 0 :(得分:4)

在表达式为大小写的情况下使用条件聚合

DEMO

select 
   count(case when ValidTo < '2019-06-12' then 1 end) as [Expired],
   count(case when ValidTo >= '2019-06-12' and ValidTo <= '2019-07-12' then 1 end) as [Due],
   count(case when ValidTo > '2019-07-12' then 1 end) as [OK]
from certificates 

输出:

Expired Due OK
1       2   3

答案 1 :(得分:1)

或者,因此您可以每天运行查询而无需更改,请尝试:

SELECT 
  SUM( 
    CASE validto 
      WHEN CURRENT_DATE 
      THEN 1 
    END ) AS expired
, SUM( 
    CASE 
      WHEN validto > CURRENT_DATE 
       AND validto <= TIMESTAMPADD(MONTH,1,CURRENT_DATE) 
      THEN 1 
    END) AS due
, SUM( 
    CASE 
      WHEN validto > TIMESTAMPADD(MONTH,1,CURRENT_DATE) 
      THEN 1 
    END) AS ok
FROM certificates;
-- out  expired | due | ok 
-- out ---------+-----+----
-- out        1 |   2 |  3
-- out (1 row)
-- out 
-- out Time: First fetch (1 row): 4.434 ms. All rows formatted: 4.466 ms