【问题标题】:Need to run three select queries without using union需要在不使用联合的情况下运行三个选择查询
【发布时间】:2019-06-04 06:17:38
【问题描述】:

我使用三个选择查询来显示来自同一视图的三个数据,但使用不同的时间线来显示数据。 所有三个选择查询的唯一区别只是时间线或日期。 那么谁能告诉我如何在不使用联合的情况下将三个同时具有三个不同时间线的选择查询的结果组合成一个选择查询。

select count(*) count from data where status in ('ACCEPTED','REJECTED','CANCELLED') 
and status_date >= '01-NOV-18' and status_date <= '31-JAN-19' 
UNION 
select count(*) count from data where status in ('ACCEPTED','REJECTED','CANCELLED') 
and status_date >= '01-FEB-19' and status_date <= '30-APR-19'
UNION 
select count(*) count from data where status in ('ACCEPTED','REJECTED','CANCELLED') 
and status_date >= '01-MAY-19' and status_date <= '31-JUL-19' order by count desc;

预期结果: 数数 100(第一条时间线) 200(第二个时间线) 300(第三条时间线)

【问题讨论】:

  • 你的 dbms 是什么?
  • 如果查询超时,那么也许看看为什么会这样?执行计划是什么样的?
  • 它使用普通的 sql 查询
  • 留出超时部分,因为它与我的前端有关,所以只关注如何将这三个选择查询写入一个选择查询。
  • UNION ALL 在这里会更好。考虑两个计数相同的情况。

标签: sql


【解决方案1】:

我们可以尝试使用条件聚合:

SELECT
    COUNT(CASE WHEN status_date BETWEEN '2018-11-01' AND '2019-01-31' THEN 1 END) AS cnt1,
    COUNT(CASE WHEN status_date BETWEEN '2019-02-01' AND '2019-04-30' THEN 1 END) AS cnt2,
    COUNT(CASE WHEN status_date BETWEEN '2019-05-01' AND '2019-07-31' THEN 1 END) AS cnt3
FROM data
WHERE
    status IN ('ACCEPTED', 'REJECTED', 'CANCELLED');

如果您的数据库支持 CTE:

WITH cte AS (
    SELECT
        COUNT(CASE WHEN status_date BETWEEN '2018-11-01' AND '2019-01-31' THEN 1 END) AS cnt1,
        COUNT(CASE WHEN status_date BETWEEN '2019-02-01' AND '2019-04-30' THEN 1 END) AS cnt2,
        COUNT(CASE WHEN status_date BETWEEN '2019-05-01' AND '2019-07-31' THEN 1 END) AS cnt3
    FROM data
    WHERE status IN ('ACCEPTED', 'REJECTED', 'CANCELLED')
)

SELECT cnt1 FROM cte
UNION ALL
SELECT cnt2 FROM cte
UNION ALL
SELECT cnt3 FROM cte;

【讨论】:

  • 看来 OP 需要 3 行单列。您的解决方案返回包含 3 列的单行。但这可能不是问题。
  • 我只需要一列,列名为计数
  • 在一列中显示三个不同结果的数据计数
  • @jarlh 是的......我虽然是这样,但事实是,这可能比 OP 已经拥有的性能更差,而且它还假设他的数据库支持 CTE。
  • 感谢蒂姆的回答,对我帮助很大。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多