улучшение sql из существующей базы данных sql - postgres - PullRequest
0 голосов
/ 01 апреля 2020

Я не очень знаком с sql. Я использую postgres для базы данных. Я получил результат от следующего sql. У меня есть несколько столбцов, но я упростил таблицу и запрос для этого вопроса.

select sum(column1), sum(column2), sum(column3), sum(column4), substring(product, 0, POSITION('-' in product)) as product_code
from table group by product_code order by product_code


column1, column2, column3, column4,   code
10          3       0           2     ABC1
11          4       0           4     ABC2
12          2       0           3     ABC3
13          1       0           6     ABC4

Как мне исправить sql сверху, чтобы получить следующий результат, как показано ниже?

column1, column2, column3, column4,   code
10          3       0           0     ABC1
10          0       0           2     ABC1
11          4       0           0     ABC2
11          0       0           4     ABC2
12          2       0           0     ABC3
12          0       0           3     ABC3
13          1       0           0     ABC4
13          0       0           6     ABC4

Если я использую этот запрос с ключевым словом union, я могу получить желаемый результат (как указано выше), но мне интересно, есть ли лучший способ сделать это.

select sum(column1), sum(column2), sum(column3), sum(column4), substring(product, 0, POSITION('-' in product)) as product_code
 from table group by product_code union select sum(column1), sum(column2), sum(column3), sum(column4), substring(product, 0, POSITION('-' in product)) as product_code
 from table group by product_code

1 Ответ

0 голосов
/ 01 апреля 2020

Требуются все комбинации code с 10, 11, 12 и 13 в первом столбце. Используйте cross join для генерации комбинаций и затем left join для ввода существующих данных:

select gs.c1, coalesce(t.c2, 0), coalesce(t.c3, 0), coalesce(t.c4, 0, 
       c.product_code
from (select distinct substring(product, 1, POSITION('-' in product)) as product_code from t) c cross join
     generate_series(10, 13, 1) as gs(c1) left join
     (select sum(column1) as c1, sum(column2) as c2,
             sum(column3) as c3, sum(column4) as c4,
             substring(product, 1, POSITION('-' in product)) as product_code
      from t
      group by code
     ) t
     on t.product_code = c.product_code and t.c1 = gs.c1
order by c.product_code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...