Мои данные выглядят так:
|cat |subcat |amount|
---------------------
|A |1 |123 |
|A |2 |456 |
|B |1 |222 |
|B |2 |333 |
В первом случае мне нужно суммировать по cat и subcat.Легко:
SELECT cat, subcat, sum(amount) FROM data GROUP BY cat, subcat
Далее, у меня есть более сложное требование, согласно которому для определенных кошек сумма должна быть "задвинута" в данный подкадр.Это может быть сохранено в другой таблице config
:
|cat |subcat|
-------------
|B |1 |
Это говорит мне, что для всех cat='B'
строк сумма должна рассматриваться как subcat=1
.Кроме того, где cat='B' AND subcat <> 1
сумма должна быть указана как ноль.Другими словами, мне нужен следующий результат:
|cat |subcat|amount|
|A |1 |123 |
|A |2 |456 |
|B |1 |555 |
|B |2 |0 |
Я не могу обновить свою таблицу данных.Конечно, я могу SELECT ... INTO
в процедуре и исправить там данные, но мне интересно, можно ли это сделать одним ударом.
Я могу довольно близко подобраться:
SELECT data.cat,
ISNULL(config.subcat, data.subcat),
SUM(amount)
FROM data
LEFT OUTER JOIN config ON (data.cat = config.cat)
GROUP BY data.cat, ISNULL(config.subcat, data.subcat)
... но мое второе требование не показывает cat:B, subcat:2
как ноль.
Возможно ли это?
Я использую Sybase IQ 12.5 (т.е. старый T-SQL, ноимеет оператор case
, который, я подозреваю, может быть полезен)