Как покинуть Inner Присоединиться к двум запросам в Sybase? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть два запроса, которые должны быть объединены. Вот мой запрос 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 Ответ

1 голос
/ 27 марта 2019

Мне было интересно, имеет ли смысл выражение 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 не имеет смысла.

...