[英]How to combine results from a query into columns of a new table
我有一个日期列表,我试图找到过期/接近过期的日期和确定日期,并建立一个显示这些日期的新表。
对我而言,最简单的方法是简单地查询数据库三遍,并在我的应用程序中构建预期的结果。 我只是想知道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
其中Expired = 1,因为第一个SQL查询返回1
其中Due = 2,因为第二个SQL查询返回2
OK = 3,因为第三个SQL查询返回3
在表达式时使用条件聚合和大小写
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
或者,这样您可以每天运行查询而无需更改,请尝试:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.