Как вернуть одинаковое количество строк из обоих запросов с помощью UNION? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть два запроса, которые используют SUM() с GROUP BY. Каждый запрос должен возвращать одно и то же число или строки. В этом случае мой SQL в Sybase возвращает отдельные строки вместо одной строки. Вот мой запрос:

SELECT type_id, category_id, category_name, type_code, amount, awarded
    FROM (
        SELECT
            type_id, 
            category_id,
            category_name, 
            type_code,
            CASE 
                WHEN category_id = 1 THEN SUM(amount)
                WHEN category_id = 2 THEN SUM(amount)
                WHEN category_id = 3 THEN SUM(amount)
                WHEN category_id = 4 THEN SUM(amount)
            END AS amount,
            0 AS awarded
        FROM Table 1
        GROUP BY category_id, type_id, category_id, type_code
        UNION
        SELECT
            null AS type_id, 
            ga.grant_category_id,
            '' AS category_name, 
            null AS type_code,
            0 AS amount,
            CASE 
                WHEN t2.category_id = 1 THEN SUM(t2.awarded)
                WHEN t2.category_id = 2 THEN SUM(t2.awarded)
                WHEN t2.category_id = 3 THEN SUM(t2.awarded)
                WHEN t2.category_id = 4 THEN SUM(t2.awarded)
            END AS awarded
        FROM Table2 t2
            INNER JOIN Table3 t3
                ON t2.rec_id = t3.rec_id
        GROUP BY t2.category_id
    ) x
    GROUP BY x.category_id

Результат запроса выглядит так:

type_id  category_id  category_name  type_code   amount   awarded
   1         2             TEST 2      REST     51804.00    0.00
   1         4             TEST 4      REST     39398.00    0.00
   1         3             TEST 3      REST     79922.00    0.00
   1         1             TEST 1      REST     70927.00    0.00
  null       1             null        null       0.00     96013.00
  null       2             null        null       0.00     78759.00
  null       3             null        null       0.00     21436.00
  null       4             null        null       0.00     74602.00

Я бы хотел, чтобы результат выглядел так:

 type_id  category_id  category_name  type_code   amount   awarded
   1         2             TEST 2      REST     51804.00    96013.00
   1         4             TEST 4      REST     39398.00    78759.00
   1         3             TEST 3      REST     79922.00    21436.00
   1         1             TEST 1      REST     70927.00    74602.00

Как этого добиться? Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Когда @Gordon говорил о JOINs, он имел в виду сделать их подзапросами и присоединиться к ним.Следующее предположение, что категории могут или не могут быть возвращены любым запросом:

SELECT
   Set1.type_id  --  Where this is not found in Set1, you specified null in Set2
  ,ISNULL(Set1.category_id, Set2.grant_category_id)  AS  category_id
  ,ISNULL(Set1.category_name, '')  --  Where this is not found in Set1, you specified <emptyString> in Set2
  ,Set1.type_code  --  Where this is not found in Set1, you specified null in Set2
  ,ISNULL(Set1.amount, 0)  --  Where this is not found in Set1, you specified 0 in Set2
  ,ISNULL(Set2.awarded, 0)  --  Where this is not found in Set2, you specified 0 in Set1
 FROM (
        SELECT
            type_id, 
            category_id,
            category_name, 
            type_code,
            SUM(CASE 
                    WHEN category_id between 1 and 4 THEN amount
                    ELSE 0
                END) AS amount
        FROM Table1
        GROUP BY
            type_id, 
            category_id,
            category_name, 
            type_code,
      ) Set1
 FULL OUTER JOIN (   
        SELECT
            t2.grant_category_id,
            SUM(CASE 
                    WHEN t2.category_id between 1 and 4 THEN t2.awarded
                END) AS awarded
        FROM Table2 t2
            INNER JOIN Table3 t3
                ON t2.rec_id = t3.rec_id
        GROUP BY
            t2.grant_category_id,
    ) Set2
  ON Set2.grant_category_Id = Set1.category_id

Отказ от ответственности: я не мог проверить синтаксис этого, поэтому может потребоваться небольшая отладка.

0 голосов
/ 25 марта 2019

Ты этого хочешь?

SELECT type_id, category_id, category_name, type_code, amount, awarded
    FROM (
        SELECT
            t1.type_id, 
            t1.category_id,
            t1.category_name, 
            t1.type_code,
            SUM(t1.amount) amount,
            SUM(t2.awarded) awarded
        FROM Table1 t1
            INNER JOIN Table2 t2
                ON t1.category_id = t2.category_id
            INNER JOIN Table3 t3
                ON t2.rec_id = t3.rec_id
        GROUP BY 
            t1.type_id, 
            t1.category_id,
            t1.category_name, 
            t1.type_code
        )    x

Более того, в вашем примере мне кажется, что есть ошибка. Не должно ли быть так? Где ключ для Table1 и Table2 равен category_id

type_id category_id category_name type_code сумма присуждается
1 2 ТЕСТ 2 ОТДЫХ 51804,00 78759,00
1 4 ТЕСТ 4 ОТДЫХ 39398,00 74602,00
1 3 ТЕСТ 3 ОТДЫХ 79922,00 21436,00
1 1 ТЕСТ 1 ОТДЫХ 70927,00 96013,00

...