powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / GROUP BY CUBE (ROLLUP, GROUPING SETS)
5 сообщений из 5, страница 1 из 1
GROUP BY CUBE (ROLLUP, GROUPING SETS)
    #39643788
Ru2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Профессионалы, помогите пожалуйста. Бился, не смог разобраться. У меня есть факты продаж в разрезе продукты по годам. Задача вывести агрегаты продаж в двухмерных куб одним селектом:

SELECT product_id, year_id, sum( sales_fact )
FROM tbl_sales
GROUP BY ROLLUP (product_id, year_id)

меня устраивает, так как возвращает то что нужно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
rownum |product_id |year_int |sum      |
-------|-----------|---------|---------|
1      |1          |2011     |821.00   |
2      |1          |2013     |100.00   |
3      |1          |2013     |738.00   |
4      |1          |         |1659.00  |
5      |2          |2011     |1649.00  |
6      |2          |2012     |1468.00  |
7      |2          |2013     |1479.00  |
8      |2          |         |4596.00  |
9      |3          |2011     |1500.00  |
10     |3          |2012     |1446.00  |
11     |3          |2013     |1582.00  |
12     |3          |         |4528.00  |
13     |           |         |10783.00 |

Но проблемы начинаются, когда по какому то продукту нет продаж в каком то году, тогда эта строка пропускается. Например, если в 2012 году не было продаж по продукту № 1, то тогда строка № 2 исчезает, и получится:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
rownum |product_id |year_int |sum      |
-------|-----------|---------|---------|
1      |1          |2011     |821.00   |
2      |1          |2013     |738.00   |
3      |1          |         |1559.00  |
4      |2          |2011     |1649.00  |
5      |2          |2012     |1468.00  |
6      |2          |2013     |1479.00  |
7      |2          |         |4596.00  |
8      |3          |2011     |1500.00  |
9      |3          |2012     |1446.00  |
10     |3          |2013     |1582.00  |
11     |3          |         |4528.00  |
12     |           |         |10683.00 |

Вопрос к профи, как составить селект так, что бы при отсутствии какого то факта продаж в кубе в этом сочетании измерений был бы выведен NULL ? То есть чтобы при отсутствии продаж продукта № 1 в 2012 году получилось вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
rownum |product_id |year_int |sum      |
-------|-----------|---------|---------|
1      |1          |2011     |821.00   |
2      |1          |2013     | NULL    |
3      |1          |2013     |738.00   |
4      |1          |         |1559.00  |
5      |2          |2011     |1649.00  |
6      |2          |2012     |1468.00  |
7      |2          |2013     |1479.00  |
8      |2          |         |4596.00  |
9      |3          |2011     |1500.00  |
10     |3          |2012     |1446.00  |
11     |3          |2013     |1582.00  |
12     |3          |         |4528.00  |
13     |           |         |10683.00 |

Документацию по CUBE, ROLLUP, GROUPING SETS читал, но решения не нашел.
...
Рейтинг: 0 / 0
GROUP BY CUBE (ROLLUP, GROUPING SETS)
    #39643791
Ru2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ru2000То есть чтобы при отсутствии продаж продукта № 1 в 2012 году получилось вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
rownum |product_id |year_int |sum      |
-------|-----------|---------|---------|
1      |1          |2011     |821.00   |
2      |1          |2013     | NULL    |
3      |1          |2013     |738.00   |
4      |1          |         |1559.00  |
5      |2          |2011     |1649.00  |
6      |2          |2012     |1468.00  |
7      |2          |2013     |1479.00  |
8      |2          |         |4596.00  |
9      |3          |2011     |1500.00  |
10     |3          |2012     |1446.00  |
11     |3          |2013     |1582.00  |
12     |3          |         |4528.00  |
13     |           |         |10683.00 |


Опечатка, здесь должен быть 2012 год, то есть вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
rownum |product_id |year_int |sum      |
-------|-----------|---------|---------|
1      |1          |2011     |821.00   |
2      |1          | 2012      | NULL    |
3      |1          |2013     |738.00   |
4      |1          |         |1559.00  |
5      |2          |2011     |1649.00  |
6      |2          |2012     |1468.00  |
7      |2          |2013     |1479.00  |
8      |2          |         |4596.00  |
9      |3          |2011     |1500.00  |
10     |3          |2012     |1446.00  |
11     |3          |2013     |1582.00  |
12     |3          |         |4528.00  |
13     |           |         |10683.00 |
...
Рейтинг: 0 / 0
GROUP BY CUBE (ROLLUP, GROUPING SETS)
    #39644098
drsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ru2000,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with
    v(n, p, y, s) as (values
    (1, 1, 2011, 821.00),
    (3, 1, 2013, 738.00),
    (5, 2, 2011, 1649.00),
    (6, 2, 2012, 1468.00),
    (7, 2, 2013, 1479.00),
    (9, 3, 2011, 1500.00),
    (10, 3, 2012, 1446.00),
    (11, 3, 2013, 1582.00)),
    x as (select p, min(y) s, max(y) e from v group by p),
    y as (select p, generate_series(s, e) y from x)

select row_number() over(order by y.p, y.y) n, y.y, y.p, sum(v.s) s
from y
  left join v on y.p = v.p and y.y = v.y
group by rollup (y.p, y.y)
order by y.p, y.y
...
Рейтинг: 0 / 0
GROUP BY CUBE (ROLLUP, GROUPING SETS)
    #39644699
Ru2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drsm
Код: sql
1.
2.
3.
4.
with...
    x as (select p, min(y) s, max(y) e from v group by p),
    y as (select p, generate_series(s, e) y from x)
...


Спасибо! Красиво!
...
Рейтинг: 0 / 0
GROUP BY CUBE (ROLLUP, GROUPING SETS)
    #39645838
drsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ru2000, you welcome.
буду теперь на собеседовании спрашивать... )
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / GROUP BY CUBE (ROLLUP, GROUPING SETS)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]