Несколько случаев, возвращающих неожиданный результат

#mysql #sql

#mysql #sql

Вопрос:

Этот запрос возвращает 154 строки

 SELECT s_campaign_id,  COUNT(b_entry_type_tag)::decimal * 1 AS tags,(COUNT(CASE WHEN b_entry_type_red = true AND s_request_type NOT IN ('Y0', 'YX') THEN 1 ELSE NULL END))::decimal * 1 AS redirects,COUNT(b_entry_type_cnv)::decimal * 100 / NULLIF((COUNT(CASE WHEN b_entry_type_red = true AND s_request_type NOT IN ('Y0', 'YX') THEN 1 ELSE NULL END))::decimal * 1,0) AS crp,SUM(f_revenue) * 1000 / NULLIF((COUNT(CASE WHEN b_entry_type_red = true AND s_request_type NOT IN ('Y0', 'YX') THEN 1 ELSE NULL END))::decimal * 1,0) AS rrm,COUNT(b_entry_type_cnv) AS conversions,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
 

в то время как это

 SELECT s_campaign_id,  COUNT(b_entry_type_tag)::decimal * 1 AS tags,(COUNT(CASE WHEN b_entry_type_red = true AND s_request_type NOT IN ('Y0', 'YX') THEN 1 ELSE NULL END))::decimal * 1 AS redirects,COUNT(b_entry_type_cnv)::decimal * 100 / NULLIF((COUNT(CASE WHEN b_entry_type_red = true AND s_request_type NOT IN ('Y0', 'YX') THEN 1 ELSE NULL END))::decimal * 1,0) AS crp,SUM(f_revenue) * 1000 / NULLIF((COUNT(CASE WHEN b_entry_type_red = true AND s_request_type NOT IN ('Y0', 'YX') THEN 1 ELSE NULL END))::decimal * 1,0) AS rrm,COUNT(b_entry_type_cnv) AS conversions,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-30'AND d_gen_date<='2021-01-30')OR(d_gen_date>='2021-01-31' AND d_gen_date<='2021-01-31')) GROUP BY s_campaign_id
 

возвращает 206 строк.
Я не понимаю, почему

Комментарии:

1. Ваш вопрос помечен как MySQL, но это недопустимый код MySQL.

2. Единственное отличие в предложении WHERE? Второй запрашивает 2 дня (неуклюжим способом).

Ответ №1:

Вы можете использовать ORDER BY и LIMIT :

 SELECT d_gen_date,  COUNT(b_entry_type_tag)::decimal * 1 AS tags,
       (COUNT(CASE WHEN b_entry_type_red = true AND s_request_type NOT IN ('Y0', 'YX') THEN 1 ELSE NULL END))::decimal * 1 AS redirects,
       COUNT(b_entry_type_cnv)::decimal * 100 / NULLIF((COUNT(CASE WHEN b_entry_type_red = true AND s_request_type NOT IN ('Y0', 'YX') THEN 1 ELSE NULL END))::decimal * 1,0) AS crp,
       SUM(f_revenue) * 1000 / NULLIF((COUNT(CASE WHEN b_entry_type_red = true AND s_request_type NOT IN ('Y0', 'YX') THEN 1 ELSE NULL END))::decimal * 1,0) AS rrm,
       COUNT(b_entry_type_cnv) AS conversions,
       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-30'AND d_gen_date <= '2021-01-30') OR
      (d_gen_date >= '2021-01-31' AND d_gen_date <= '2021-01-31')
GROUP BY d_gen_date
ORDER BY d_gen_date DESC
LIMIT 1;
 

Комментарии:

1. любой другой способ сделать это без order by и limit 1? поскольку d_gen_date является динамическим и изменяется на другой столбец

2. @cgvfgf34 . , , я не уверен, что означает ваш комментарий. Это отвечает на вопрос, который вы задали здесь — и d_gen_date выглядит как столбец в этом запросе.