#sybase #sap-ase
#sybase #sap-ase
Вопрос:
У меня есть два запроса, которые следует объединить. Вот мой запрос 1:
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.name, t1.rec_id, t1.category, t1.code
Запрос 1 выдает этот набор результатов:
Rec ID Category Name Code Amount
1 1 A MIX 70927.00
1 3 D MIX 19922.00
1 2 H MIX 55104.00
1 4 J MIX 76938.00
Тогда у меня есть запрос 2:
SELECT
CASE
WHEN t2.category_id = 1 THEN SUM(t2.sum)
WHEN t2.category_id = 2 THEN SUM(t2.sum)
WHEN t2.category_id = 3 THEN SUM(t2.sum)
WHEN t2.category_id = 4 THEN SUM(t2.sum)
END AS TotalSum
FROM Table2 t2
INNER JOIN Table1 t1
ON t1.amnt_id = t2.amnt_id
AND t2.unique_id = @unique_id
GROUP BY t2.category_id
Результирующий набор запроса 2 таков:
TotalSum
186013.00
47875.00
12136.00
974602.00
Все, что мне нужно, это этот результирующий набор, который объединяет запрос 1 и запрос 2:
Rec ID Category Name Code Amount TotalSum
1 1 A MIX 70927.00 186013.00
1 3 D MIX 19922.00 47875.00
1 2 H MIX 55104.00 12136.00
1 4 J MIX 76938.00 974602.00
Как вы можете видеть, существует связь между table 1
и table 2
. Это соединение является amnt_id
. Тем не менее, я попытался выполнить LEFT INNER JOIN
запрос 1, а затем просто использовать ту же логику с case statement
, чтобы получить общую сумму для таблицы 2. К сожалению, версия Sybase, которую я использую, не поддерживает левое внутреннее соединение. Мне интересно, есть ли другой способ объединить эти два запроса? Спасибо
Комментарии:
1. Можете ли вы объяснить нам, что вы подразумеваете под «объединением» двух запросов, показав нам, каков ожидаемый результат?
2. @TimBiegeleisen Я обновил свой вопрос с желаемым результатом вывода. Спасибо.
Ответ №1:
Я задавался вопросом, имеет ли смысл оператор CASE в первом запросе, потому что он суммирует в каждой строке. Существуют ли другие значения для столбца name, кроме A, D, H, J? Если нет, вы можете изменить оператор CASE на SUM(t1.amount) AS Amount
. Также ГРУППИРОВКА ПО в первом запросе кажется мне сомнительной: вы группируете по столбцу идентификатора записи — это означает, что вы вообще не группируете, а вместо этого возвращаете каждую строку. Если это то, чего вы действительно хотите, вы можете вообще не указывать СУММУ и просто вернуть столбец с чистой суммой.
Насколько я понял вашу проблему и вашу структуру данных: значения в Table2 являются своего рода суммами категорий, а значения в Table1 являются подмножествами. Вы хотели бы видеть сумму категории для каждой категории в Table1 рядом с отдельными суммами?
Обычно вы бы использовали CTE (обычное табличное выражение, «С предложением»), но 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 (который я не понимаю из ваших запросов), но это практический способ обойти отсутствующую в ASE функцию CTE.
Кстати: это либо INNER JOIN
(только соответствующие записи из обеих таблиц), либо LEFT (OUTER) JOIN
(все слева, только соответствующие записи из правой таблицы), но LEFT INNER JOIN
не имеет смысла.
Комментарии:
1. Оливер, спасибо тебе за твой отзыв. Я знаю, что некоторые столбцы не имеют смысла, но я использовал некоторые имена только для примера. Да, левое соединение имеет смысл, и это то, что я изменил в своем запросе. В Sybase есть некоторые ограничения, и мне пришлось воспользоваться вашим подходом, описанным выше. Спасибо.