Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос по итогу  [new]
ferzmikk
Member

Откуда:
Сообщений: 2247
Здравствуйте!

Есть исходные данные:
+SQL
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
--Вариант 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.

Скажите, как правильно написать второй вариант?
13 окт 21, 16:22    [22383218]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по итогу  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4966
ferzmikk,

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

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

--Вариант 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, Дата
13 окт 21, 16:32    [22383226]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по итогу  [new]
ferzmikk
Member

Откуда:
Сообщений: 2247
a_voronin
ferzmikk,

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

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

Отдельно думаю еще о другом варианте, где все строки "ГруппаSKU" включая NULL и в итогах в этом поле не входят NULL.
13 окт 21, 17:07    [22383244]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по итогу  [new]
ferzmikk
Member

Откуда:
Сообщений: 2247
a_voronin,

Как вариант. Спасибо!
13 окт 21, 17:25    [22383252]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по итогу  [new]
ferzmikk
Member

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

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

Я правильно понимаю, что во втором варианте так не получится?
13 окт 21, 17:46    [22383267]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по итогу  [new]
a_voronin
Member

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

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

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


Функция GROUPING работает и при ROLLUP
13 окт 21, 20:08    [22383329]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по итогу  [new]
ferzmikk
Member

Откуда:
Сообщений: 2247
a_voronin
ferzmikk
Я правильно понимаю, что во втором варианте так не получится?
Функция GROUPING работает и при ROLLUP
Получилось, спасибо!
13 окт 21, 20:36    [22383344]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по итогу  [new]
ferzmikk
Member

Откуда:
Сообщений: 2247
Еще такой вопрос.

Добавляем еще одну строку со значением 0.
+SQL. Исходные данные
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
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
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, Дата;
Запрос работает, но код становится длиннее: используется вложенный запрос.

Скажите, в первом варианте возможно отсеить без использования вложенности?
14 окт 21, 13:50    [22383635]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по итогу  [new]
aleks222
Member

Откуда:
Сообщений: 1759
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, Дата;


Скрижали завета читать не пробовали?
14 окт 21, 16:33    [22383778]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по итогу  [new]
ferzmikk
Member

Откуда:
Сообщений: 2247
Упс, про агрегирующую функцию забыл

aleks222,

Спасибо!
14 окт 21, 16:57    [22383789]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить