Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по итогу / 10 сообщений из 10, страница 1 из 1
13.10.2021, 16:22
    #40104167
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по итогу
Здравствуйте!

Есть исходные данные:
SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE @Table1 TABLE(
	ГруппаSKU VARCHAR(10),
	SKU VARCHAR(10),
	Дата INTEGER,
	Мера1 INTEGER,
	Мера2 INTEGER
)

INSERT INTO @Table1 
	(ГруппаSKU, SKU, Дата, Мера1, Мера2)
VALUES
	('Группа SKU', 'SKU 1', 202001, 10, 20),
	('Группа SKU', 'SKU 2', 202001, 10, 20),
	('Группа SKU', 'SKU 3', 202101, 10, 20),
	('Группа SKU', 'SKU 4', 202101, 10, 20),
	('Группа SKU', 'SKU 5', 202001, 10, 20),
	('Группа SKU', 'SKU 6', 202001, 10, 20),
	('Группа SKU', 'SKU 7', 202101, 10, 20),
	('Группа SKU', 'SKU 8', 202101, 10, 20)
	--,(Null, 'SKU 9', 202101, 10, 20)
	;


Есть два варианта SQL-запросов, которые выводят таблицу с итоговыми данными. Второй вариант по короче.
SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
--Вариант 1
SELECT
	ГруппаSKU,
	Дата,
	SUM(Мера1) AS Мера1,
	SUM(Мера2) AS Мера2
FROM
	@Table1
GROUP BY
	ГруппаSKU,
	Дата

UNION ALL

SELECT
	'ВСЕ' AS ГруппаSKU,
	Дата,
	SUM(Мера1) AS Мера1,
	SUM(Мера2) AS Мера2
FROM
	@Table1
GROUP BY	
	Дата
ORDER BY
	ГруппаSKU,
	Дата;

--Вариант 2
SELECT	
	COALESCE(ГруппаSKU, 'ВСЕ') AS ГруппаSKU,
	Дата,
	SUM(Мера1) AS Мера1,
	SUM(Мера2) AS Мера2
FROM
	@Table1
GROUP BY
	Дата,
ROLLUP (ГруппаSKU)
ORDER BY
	 ГруппаSKU,
         Дата

Запросы работают верно при имеющихся данных.

Но если в INSERT INTO убрать комментарий, то второй вариант работает не корректно: в поле "Группа SKU" присваивает не NULL, а "Все". То есть по факту для этой строки нужно отобразить Null.

Скажите, как правильно написать второй вариант?
...
Рейтинг: 0 / 0
13.10.2021, 16:32
    #40104172
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по итогу
ferzmikk,

Вы точно правильно сформулировали, чего хотите.

Можно записать так, но дает результат эквивалентный вашему.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
--Вариант 3
SELECT	
	IIF(GROUPING(ГруппаSKU)=1, 'ВСЕ', ГруппаSKU) AS ГруппаSKU,
	Дата,
	SUM(Мера1) AS Мера1,
	SUM(Мера2) AS Мера2
FROM
	@Table1
GROUP BY GROUPING SETS ((Дата,ГруппаSKU), (Дата))
ORDER BY ГруппаSKU, Дата
...
Рейтинг: 0 / 0
13.10.2021, 17:07
    #40104179
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по итогу
a_voronin
ferzmikk,

Вы точно правильно сформулировали, чего хотите.

Да. Строки все "ГруппаSKU" включая NULL. И плюс еще итоговые строки, в которые входят NULL в это поле.

Отдельно думаю еще о другом варианте, где все строки "ГруппаSKU" включая NULL и в итогах в этом поле не входят NULL.
...
Рейтинг: 0 / 0
13.10.2021, 17:25
    #40104181
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по итогу
a_voronin,

Как вариант. Спасибо!
...
Рейтинг: 0 / 0
13.10.2021, 17:46
    #40104186
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по итогу
ferzmikk
Но если в INSERT INTO убрать комментарий, то второй вариант работает не корректно: в поле "Группа SKU" присваивает не NULL, а "Все". То есть по факту для этой строки нужно отобразить Null.

Скажите, как правильно написать второй вариант?

Я правильно понимаю, что во втором варианте так не получится?
...
Рейтинг: 0 / 0
13.10.2021, 20:08
    #40104216
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по итогу
ferzmikk
ferzmikk
Но если в INSERT INTO убрать комментарий, то второй вариант работает не корректно: в поле "Группа SKU" присваивает не NULL, а "Все". То есть по факту для этой строки нужно отобразить Null.

Скажите, как правильно написать второй вариант?

Я правильно понимаю, что во втором варианте так не получится?


Функция GROUPING работает и при ROLLUP
...
Рейтинг: 0 / 0
13.10.2021, 20:36
    #40104225
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по итогу
a_voronin
ferzmikk
Я правильно понимаю, что во втором варианте так не получится?
Функция GROUPING работает и при ROLLUP
Получилось, спасибо!
...
Рейтинг: 0 / 0
14.10.2021, 13:50
    #40104381
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по итогу
Еще такой вопрос.

Добавляем еще одну строку со значением 0.
SQL. Исходные данные
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
DECLARE @Table1 TABLE(
	ГруппаSKU VARCHAR(20),
	SKU VARCHAR(10),
	Дата INTEGER,
	Мера1 INTEGER,
	Мера2 INTEGER
)

INSERT INTO @Table1 
	(ГруппаSKU, SKU, Дата, Мера1, Мера2)
VALUES
	('Группа SKU 1', 'SKU 1', 202001, 10, 20),
	('Группа SKU 1', 'SKU 2', 202001, 10, 20),
	('Группа SKU 1', 'SKU 3', 202101, 10, 20),
	('Группа SKU 1', 'SKU 4', 202101, 10, 20),
	('Группа SKU 2', 'SKU 5', 202001, 10, 20),
	('Группа SKU 2', 'SKU 6', 202001, 10, 20),
	('Группа SKU 2', 'SKU 7', 202101, 10, 20),
	('Группа SKU 2', 'SKU 8', 202101, 10, 20)
	,(Null, 'SKU 9', 202101, 10, 20)
	,('Группа SKU 3', 'SKU 10', 202101, 0, 0)
	;


Нужно после агрегации отсеить строки, то есть Мера1 <> 0.

SQL. Вариант1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT	
	IIF(GROUPING(ГруппаSKU)=1, 'ВСЕ', ГруппаSKU) AS ГруппаSKU,
	Дата,
	SUM(Мера1) AS Мера1,
	SUM(Мера2) AS Мера2
FROM
	@Table1
GROUP BY
	Дата,
ROLLUP
	(ГруппаSKU)
HAVING
	Мера1 <> 0
ORDER BY
	 ГруппаSKU, Дата;

Появляется ошибка.

SQL. Вариант2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT
	ГруппаSKU,
	Дата,
	Мера1,
	Мера2
FROM
	(SELECT	
		IIF(GROUPING(ГруппаSKU)=1, 'ВСЕ', ГруппаSKU) AS ГруппаSKU,
		Дата,
		SUM(Мера1) AS Мера1,
		SUM(Мера2) AS Мера2
	FROM
		@Table1
	GROUP BY
		Дата,
	ROLLUP
		(ГруппаSKU)	
	) tab1
WHERE
	Мера1 <> 0
ORDER BY
	 ГруппаSKU, Дата;

Запрос работает, но код становится длиннее: используется вложенный запрос.

Скажите, в первом варианте возможно отсеить без использования вложенности?
...
Рейтинг: 0 / 0
14.10.2021, 16:33
    #40104497
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по итогу
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT	
	IIF(GROUPING(ГруппаSKU)=1, 'ВСЕ', ГруппаSKU) AS ГруппаSKU,
	Дата,
	SUM(Мера1) AS Мера1,
	SUM(Мера2) AS Мера2
FROM
	@Table1
GROUP BY
	Дата,
ROLLUP
	(ГруппаSKU)
HAVING
	SUM(Мера1) <> 0
ORDER BY
	 ГруппаSKU, Дата;



Скрижали завета читать не пробовали?
...
Рейтинг: 0 / 0
14.10.2021, 16:57
    #40104504
ferzmikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по итогу
Упс, про агрегирующую функцию забыл

aleks222,

Спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по итогу / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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