powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по итогу
10 сообщений из 10, страница 1 из 1
Вопрос по итогу
    #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
Вопрос по итогу
    #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
Вопрос по итогу
    #40104179
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
ferzmikk,

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

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

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

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

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

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

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

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


Функция GROUPING работает и при ROLLUP
...
Рейтинг: 0 / 0
Вопрос по итогу
    #40104225
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
ferzmikk
Я правильно понимаю, что во втором варианте так не получится?
Функция GROUPING работает и при ROLLUP
Получилось, спасибо!
...
Рейтинг: 0 / 0
Вопрос по итогу
    #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
Вопрос по итогу
    #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
Вопрос по итогу
    #40104504
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, про агрегирующую функцию забыл

aleks222,

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


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