Звучит так, как будто вы хотите, чтобы 0 был представлен, хотя этого значения не было в столбце cola
.
Мой первый подход:
- собрать сумму в производной таблице (
t
)
- СОЕДИНИТЕ, что против другой производной таблицы с единственной строкой, содержащей Вашу строку равенства. (* 1 010 *)
- ВЫБРАТЬ МАКС, который отфильтровывает дубликаты, когда
UNION ALL
создает дубликат в случае, если в таблице действительно существуют равные t
.
SELECT MySymbol, MAX(MySumB) AS MySumB,
MAX(MySumC) AS MySumC,
MAX(MySumD) AS MySumD
FROM (
SELECT MySymbol,MySumB,MySumC,MySumD
FROM (
SELECT CASE WHEN cola < 0 THEN '-'
WHEN cola > 0 THEN '+'
ELSE '='
END AS MySymbol,
SUM(colb) AS MySumB, SUM(colc) AS MySumC, SUM(cold) AS MySumD,
MAX(CASE WHEN cola < 0 THEN 1
WHEN cola > 0 THEN 3
ELSE 2
) AS Sort
FROM Table1
WHERE this = that
GROUP BY CASE WHEN cola < 0 THEN '-'
WHEN cola > 0 THEN '+'
ELSE '=' END
UNION ALL
SELECT '=' AS MySymbol, 0,0,0,0
) t
) t2
GROUP BY MySymbol
ORDER BY MySumD
Это могло бы быть немного более трудным решением, если бы мы знали, какую СУБД вы используете. Выше приведено соответствие ANSI, поэтому оно будет работать где угодно. Вероятно, существует менее подробное решение для Oracle, SQL Server или MySQL с использованием временных таблиц или табличных переменных. Поскольку СУБД не была указана, я не смог дать конкретный ответ для платформы и применил общий подход.