Мне было интересно, имеет ли смысл выражение CASE в первом запросе, потому что оно суммируется в каждой строке. Существуют ли другие значения для столбца имени, кроме A, D, H, J? Если нет, вы можете изменить оператор CASE на SUM(t1.amount) AS Amount
. Также GROUP BY в первом запросе кажется мне сомнительным: вы группируете по столбцу id записи - это означает, что вы вообще не группируете, а вместо этого возвращаете каждую строку. Если это действительно то, чего вы действительно хотите, вы можете вообще не указывать СУММУ и просто возвращать столбец pure .
Насколько я понял, ваша проблема и ваша структура данных: значения в Таблице 2 представляют собой суммы категорий , а значения в Таблице 1 являются подмножествами. Вы хотели бы видеть сумму категории для каждой категории в Таблице 1 рядом с отдельными суммами?
Обычно вы используете CTE (общее табличное выражение, «предложение WITH»), но ASE не поддерживает CTE, поэтому нам приходится работать с объединениями. Я воссоздал ваши таблицы в моей базе данных SQL Anywhere и собрал этот пример. В двух словах: оба запроса являются подзапросами во внешнем запросе и остаются присоединенными к идентификатору категории:
SELECT *
FROM
(
SELECT
t1.rec_id,
t1.category,
t1.name,
t1.code,
CASE
WHEN t1.name= 'A' THEN SUM(t1.amount)
WHEN t1.name = 'D' THEN SUM(t1.amount)
WHEN t1.name = 'H' THEN SUM(t1.amount)
WHEN t1.name = 'J' THEN SUM(t1.amount)
END AS Amount
FROM Table1 t1
GROUP BY t1.rec_id, t1.name, t1.category, t1.code
) AS t1
LEFT JOIN
(
SELECT category_id, SUM(sum) FROM
table2
GROUP BY category_id
) AS totals(category_id, total_sum)
ON totals.category_id = t1.category;
Этот запрос дает мне:
Rec ID Category Name Code Amount Category_id total_sum
2 3 D MIX 19922.00 3 47875.00
3 2 H MIX 55104.00 2 12136.00
1 1 A MIX 70927.00 1 186013.00
4 4 J MIX 76938.00 4 974602.00
Вы, безусловно, должны немного подправить его, включая столбец t2.unique_id (что я не понимаю из ваших запросов), но это практичный способ обойти отсутствующую функцию CTE в ASE.
Кстати: это либо INNER JOIN
(только соответствующие записи из обеих таблиц), либо LEFT (OUTER) JOIN
(все слева, только соответствующие записи из правой таблицы), но LEFT INNER JOIN
не имеет смысла.