我有以下带有左连接的查询,我可以将其设为子查询吗?因为它是同一张桌子,它会工作得更快吗? 我只想获取收入行并仅为他们显示收入2
SELECT *
FROM
(SELECT
s_campaign_id,
SUM(CASE
WHEN d_gen_date BETWEEN '2021-01-31' AND '2021-01-31'
THEN f_revenue
ELSE 0
END) AS revenue,
SUM(CASE
WHEN d_gen_date BETWEEN '2021-01-30' AND '2021-01-30'
THEN f_revenue
ELSE 0
END) AS revenue2
FROM
tbl_reports
WHERE
(d_gen_date >= '2021-01-31'
AND d_gen_date <= '2021-01-31')
GROUP BY
s_campaign_id) d1
LEFT JOIN
(SELECT
s_campaign_id,
SUM(CASE
WHEN d_gen_date BETWEEN '2021-01-30' AND '2021-01-30'
THEN f_revenue
ELSE 0
END) AS revenue2
FROM
tbl_reports
WHERE
(d_gen_date BETWEEN '2021-01-30' AND '2021-01-30')
GROUP BY
s_campaign_id) d2 ON d1.s_campaign_id = d2.s_campaign_id
答案 0 :(得分:0)
您的查询非常可疑,因为您可以在第一个查询中使用微小的更改来获得所需的结果,如下所示:
SELECT T.* FROM
(SELECT s_campaign_id,
SUM(CASE WHEN d_gen_date = '2021-01-31' THEN f_revenue ELSE 0 END) AS revenue,
SUM(CASE WHEN d_gen_date = '2021-01-30' THEN f_revenue ELSE 0 END) AS revenue2
FROM tbl_reports
WHERE (d_gen_date>='2021-01-30' AND d_gen_date<='2021-01-31')
GROUP BY s_campaign_id) T
WHERE EXISTS (select 1 from tbl_reports tt
where t.s_campaign_id = tt.s_campaign_id
and tt.d_gen_date ='2021-01-31')
答案 1 :(得分:0)
只使用聚合,你不需要因为你使用相同的日期
select s_campaign_id,
SUM(CASE WHEN d_gen_date ='2021-01-31' THEN f_revenue
ELSE 0
END) AS revenue,
SUM(CASE WHEN d_gen_date ='2021-01-30' THEN f_revenue
ELSE 0
END) AS revenue2
FROM tbl_reports
WHERE d_gen_date>='2021-01-30' and d_gen_date<='2021-01-31'
GROUP BY
s_campaign_id
答案 2 :(得分:0)
您正在使用条件聚合,即聚合函数 (SUM(CASE WHEN ... END)
) 内的条件。但是由于您的 WHERE
子句,这些条件要么总是满足,要么总是不满足。因此,您可以简化查询,因为您不需要条件聚合:
SELECT d1.s_campaign_id, d1.revenue, d2.revenue2
FROM
(
SELECT s_campaign_id, SUM(f_revenue) AS revenue
FROM tbl_reports
WHERE d_gen_date = '2021-01-31'
GROUP BY s_campaign_id
) d1
LEFT JOIN
(
SELECT s_campaign_id, SUM(f_revenue) AS revenue2
FROM tbl_reports
WHERE d_gen_date = '2021-01-30'
GROUP BY s_campaign_id
) d2 ON d1.s_campaign_id = d2.s_campaign_id;
或者您确实使用了条件聚合,但是您不需要加入两个中间结果集:
SELECT
s_campaign_id,
SUM(CASE WHEN d_gen_date = '2021-01-31' THEN f_revenue ELSE 0 END) AS revenue,
SUM(CASE WHEN d_gen_date = '2021-01-30' THEN f_revenue ELSE 0 END) AS revenue2
FROM tbl_reports
WHERE d_gen_date >= '2021-01-30' AND d_gen_date <= '2021-01-31'
GROUP BY s_campaign_id
HAVING MAX(CASE WHEN d_gen_date = '2021-01-31' THEN 1 ELSE 0 END) = 1;
任何一个查询都应该受益于这个索引:
CREATE INDEX idx ON tbl_reports (d_gen_date, s_campaign_id);