Любопытно, есть ли какие-либо методы для суммирования итогов на основе еженедельной классификации за n дней, кроме объединения - PullRequest
1 голос
/ 06 июня 2019

Я рассчитываю подвести итог на основе случая, который варьируется в течение недели от запроса ниже, чтобы накопить до 90 дней.В настоящее время я могу сделать это, ограничивая даты и объединяя их вместе;однако, есть ли другой способ?

Данный запрос занимает всего 2 недели, и мне пришлось бы продолжать объединять дополнительные подвыборы, чтобы выполнить 90 дней.

select comp_id, sum(total) from (
(
SELECT CASE
         WHEN AVG(amount) < 10 THEN 0 
         WHEN COUNT(p_id) < SUM(amount)*.5
         THEN SUM(amount)*.5
         ELSE COUNT(p_id) 
        END as total, avg(amount), comp_id
FROM p_container INNER JOIN chg ON chg_p_id = p_id 
INNER JOIN c_type ON c_type_id = chtype_id
where correction_name like '%correction word%'
AND p_date BETWEEN GETDATE () - 9 AND GETDATE () - 2
group by comp_id
) UNION ALL (
SELECT CASE
         WHEN AVG(amount) < 5 THEN 0 
         WHEN COUNT(p_id) < SUM(amount)*.06
         THEN SUM(amount)*.06 
         ELSE COUNT(p_id) 
        END as total, avg(amount), comp_id
FROM p_container INNER JOIN chg ON chg_p_id = p_id 
INNER JOIN c_type ON c_type_id = chtype_id
where correction_name like '%correction word%'
AND p_date BETWEEN GETDATE () - 17  AND GETDATE () - 10 
group by comp_id
)) group by comp_id

1 Ответ

0 голосов
/ 06 июня 2019

Вы можете использовать выражения case:

SELECT (CASE WHEN p_date BETWEEN GETDATE() - 9 AND GETDATE() - 2 THEN 'group1'
             WHEN p_date BETWEEN GETDATE() - 17 AND GETDATE() - 10 THEN 'group2'
        END) as grp,
       (CASE WHEN AVG(amount) < 10 THEN 0 
             WHEN COUNT(p_id) < SUM(amount)*0.5 THEN SUM(amount)*0.5
              ELSE COUNT(p_id) 
        END) as total, AVG(amount),
       comp_id
FROM p_container INNER JOIN
     chg
     ON chg_p_id = p_id INNER JOIN
     c_type
     ON c_type_id = chtype_id
WHERE correction_name like '%correction word%' AND
      p_date >= GETDATE() - 17 
GROUP BY grp, comp_id;
...