СВЕРНИТЕ, чтобы сохранить только Общий итог и удалить промежуточные итоги

#sql #mariadb #mariadb-10.5

Вопрос:

У меня есть 2 вопроса для следующего вывода запроса:

 
    COALESCE(Division,'Grand Total') Divi,
    COALESCE(Section,'DivTotal') Sec,
    COALESCE(m.Department,'SecTotal') Dept,
    COALESCE(Assortment,'DeptTotal') Assort,
    COALESCE(Promo,'') Prom,
    COALESCE(Range_Details,'') Range_,
    SUM(`WH STK`) WH_STK,
    SUM(`AL STK QTY`) AL_STK,
    SUM(`AL SAL QTY`) AL_SAL,
    SUM(`AL LYa`) LY_a,
    SUM(`AL LYb`) LY_b,
    SUM(`AL MIN`) AL_MIN,
    b.LYa_tot,
    b.LYb_tot,
    COALESCE(ROUND(((SELECT b.LYb_tot)/(SELECT b.LYa_tot))* COALESCE(SUM(`AL SAL QTY`),0),0),0) 'upcoming',
    COALESCE((ROUND(((SELECT b.LYb_tot)/(SELECT b.LYa_tot))*SUM(`AL SAL QTY`),0)    SUM(`AL MIN`)) - SUM(`AL STK QTY`),0) 'Dispatch'

FROM
(.....I have removed rest of the query part to make it short....) m
GROUP BY
    m.Division,
    m.Section,
    m.Department,
    m.Assortment,
    m.Promo,
    m.Range_Details WITH ROLLUP HAVING
(Division IS NOT NULL AND Section IS NOT NULL AND Department IS NULL AND Assortment IS NULL AND Promo IS NULL AND Range_Details IS NULL )
OR (Division IS NOT NULL AND Section IS NOT NULL and Section NOT IN  ('OTHERS','W_ACCESSORIES','W_BOTTOMWEAR','W_INNERWEAR','W_UPPERWEAR') AND Department IS NOT NULL AND Assortment IS NULL AND Promo IS NULL AND Range_Details IS NULL )
OR (Division IS NOT NULL AND Section NOT IN  ('OTHERS','W_ACCESSORIES','W_BOTTOMWEAR','W_INNERWEAR','W_UPPERWEAR') AND Department IS NOT NULL and Department NOT IN ('GLOVE','RAINCOAT','SWIM SUIT','CORD TROUSERS','COTTON TROUSERS','FORMAL TROUSERS') AND Assortment IS NOT NULL AND Promo IS not NULL AND Range_Details IS not NULL )
OR (Division IS NULL AND Section IS NULL AND Department IS NULL AND Assortment IS NULL AND Promo IS NULL AND Range_Details IS NULL )
 

введите описание изображения здесь
1.) Как мне сохранить только «Общий итог» в последней строке и удалить «Общий итог», «Общий итог», «Общий итог».

2.) Есть ли лучший вариант использовать «СО СВЕРТКОЙ», чтобы я мог выбирать только столбцы, в которых мне нужен промежуточный итог, вместо того, чтобы иметь промежуточный итог для всех столбцов в предложении GROUP BY?

Примечание: Я уже использую несколько СОЮЗОВ, поэтому, если возможно, пожалуйста, дайте решение без объединения. не могу вставить изображение, приношу извинения за доставленные неудобства.

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

1. Да, ROLLUP вероятно, его можно заставить работать на вас здесь. Пожалуйста, добавьте примеры данных в свой вопрос, чтобы сделать проблему более ясной (сам по себе запрос нам не очень помогает).

2. Просто добавьте AND Sec != 'DivTotal' AND Dept != 'SecTotal' AND Assort != 'DeptTotal') к своему HAVING пункту?

3. @Nick извините, но это удаляет общую строку. Мне нужна общая строка с разделом, Отделом и Ассортиментом в качестве пустой

4. Ах, извините, да, вам нужно будет это сделать AND (Divi == 'Grand Total' OR Sec != 'DivTotal' AND Dept != 'SecTotal' AND Assort != 'DeptTotal' )`

5. Так тоже не получалось. Теперь я решил эту проблему, солутино опубликовал ниже.

Ответ №1:

Я думаю, что CTE и резюме, вероятно, являются более простым методом:

 with cte as (
      select m.Division, m.Section, m.Department, m.Assortment,  m.Promo, m.Range_Details,
             . . . 
      from . . .
      group by m.Division, m.Section, m.Department, m.Assortment,  m.Promo, m.Range_Details
     )
select *
from cte
union all
select 'Grand Total', null, null, null, null, null,
       sum(WH_STK), . . . 
from cte;
 

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

1. На данный момент я решил эту проблему, но позже попробую этот подход, чтобы найти ее, если в этом будет больше смысла. Спасибо, Гордон.

Ответ №2:

Я решил эту проблему таким образом, вдохновленный ответом на сам stackoverflow:

 COALESCE(Division,'Grand Total') Divi,
(CASE WHEN Division IS NOT NULL THEN COALESCE(Section,'DivTotal') ELSE '' END) Sec,
(CASE WHEN Section IS NOT NULL THEN COALESCE(m.Department,'SecTotal') ELSE '' END) Dept,
(CASE WHEN m.Department IS NOT NULL THEN COALESCE(Assortment,' Total') ELSE '' END) Assort,
COALESCE(Promo,'') Prom,
(CASE WHEN Division IS NULL  THEN COALESCE(Range_Details,'Grand Total') ELSE COALESCE(Range_Details,'') END) Range_
 

Спасибо всем, что нашли время.