powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выкрутасы с GROUP BY GROUPING SETS
7 сообщений из 7, страница 1 из 1
Выкрутасы с GROUP BY GROUPING SETS
    #39956888
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, вот почему, собственно говоря, и с какого ... эти два запроса дают разный результат?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT RN10, RN100, COUNT(*) FROM 
(
	SELECT RN, RN/10 AS RN10, RN/100 AS RN100 FROM 
	(
		SELECT RN = -1 + ROW_NUMBER() OVER (ORDER BY 1/0) FROM master..spt_values
	) A
) B
GROUP BY GROUPING SETS ((RN10), (RN100), ())
ORDER BY 1, 2


SELECT RN10, RN10 / 10, COUNT(*) FROM 
(
	SELECT RN, RN/10 AS RN10, RN/100 AS RN100 FROM 
	(
		SELECT RN = -1 + ROW_NUMBER() OVER (ORDER BY 1/0) FROM master..spt_values
	) A
) B
GROUP BY GROUPING SETS ((RN10), (RN10 / 10), ())
ORDER BY 1, 2



Вопрос в NULL во второй колонке.
...
Рейтинг: 0 / 0
Выкрутасы с GROUP BY GROUPING SETS
    #39956988
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У всех No Comments? Даже invm не хочет ничего сказать. Странно как-то. Или никто не понял, о чем я?
...
Рейтинг: 0 / 0
Выкрутасы с GROUP BY GROUPING SETS
    #39957005
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

там планы запросов разные.
...
Рейтинг: 0 / 0
Выкрутасы с GROUP BY GROUPING SETS
    #39957046
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

Если грубо, то значение RN10 / 10 вычисляется два раза - до группировок и в селекте.
И в селекте для вычисления берется RN10 уже после группировок. Отсюда и NULL'ы
В плане выполнения все это видно.
...
Рейтинг: 0 / 0
Выкрутасы с GROUP BY GROUPING SETS
    #39957055
nullin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin, поможет cross apply(values (RN10 / 10)) a(RN10C)
...
Рейтинг: 0 / 0
Выкрутасы с GROUP BY GROUPING SETS
    #39957227
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
a_voronin,

Если грубо, то значение RN10 / 10 вычисляется два раза - до группировок и в селекте.
И в селекте для вычисления берется RN10 уже после группировок. Отсюда и NULL'ы
В плане выполнения все это видно.


Почему в таком раскладе работает ожидаемо?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT RN10, SUBSTRING(RN,3,99), COUNT(*) FROM 
(
	SELECT RN, SUBSTRING(RN,2,99) AS RN10 FROM 
	(
		SELECT RN = CAST(-1 + ROW_NUMBER() OVER (ORDER BY 1/0) AS VARCHAR(99)) FROM master..spt_values
	) A
) B
GROUP BY GROUPING SETS ((RN10), (SUBSTRING(RN,3,99)), ())
ORDER BY 1, 2



А в таком нет

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT RN10, RN10 / 10, COUNT(*) FROM 
(
	SELECT RN, RN/10 AS RN10, RN/100 AS RN100 FROM 
	(
		SELECT RN = -1 + ROW_NUMBER() OVER (ORDER BY 1/0) FROM master..spt_values
	) A
) B
GROUP BY GROUPING SETS ((RN10), (RN10 / 10), ())
ORDER BY 1, 2
...
Рейтинг: 0 / 0
Выкрутасы с GROUP BY GROUPING SETS
    #39957255
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin
Почему в таком раскладе работает ожидаемо?
Потому что не вычисляется в селекте, а берется ранее вычисленное значение.
В планах выполнения все это видно.

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


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