Группировка по дням недели

Здравствуйте!
Нужно сгруппировать данные по дням недели. Поблема в том, что день недели можно получить только использовав колонку стекстом SQL. По таким полям группировка не делается. Запрос формируется без Group By.

SELECT
DATENAME(dw,StartDate) AS [WeekDay],
SUM([tbl_Document].[Value]) AS [Value]
FROM
[dbo].[tbl_Document] AS [tbl_Document]
WHERE(NOT [tbl_Document].[StartDate] IS NULL AND
CAST(CONVERT(VARCHAR(8), [tbl_Document].[StartDate], 112) AS DATETIME)>=:StartDate
AND CAST(CONVERT(VARCHAR(8), [tbl_Document].[StartDate], 112) AS DATETIME)=:EndDate)

В результате ошибка: Столбец "dbo.tbl_Document.StartDate" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY

Нравится

10 комментариев

Как вариант, обернуть это еще в один запрос: во внутреннем - определяем день недели, во внешнем - группируем по нему и вычисляем сумму:

SELECT [WeekDay], SUM([Value])
FROM
(SELECT
DATENAME(dw,StartDate) AS [WeekDay],
[tbl_Document].Value AS [Value]
FROM
[dbo].[tbl_Document] AS [tbl_Document]
WHERE(NOT [tbl_Document].[StartDate] IS NULL AND
CAST(CONVERT(VARCHAR(8), [tbl_Document].[StartDate], 112) AS DATETIME)>=:StartDate
AND CAST(CONVERT(VARCHAR(8), [tbl_Document].[StartDate], 112) AS DATETIME)<=:EndDate)
) TEMP
GROUP BY [WeekDay]

"Тюльпа Владимир" написал:Нужно сгруппировать данные по дням недели. Поблема в том, что день недели можно получить только использовав колонку стекстом SQL.

Владимир, попробуйте сделать представление на уровне БД и в конфигурации таблицу с таким же именем, но не сохраняйте структуру. И после этого ядро сможет работать с колонкой, которая будет содержать день недели, как с обычной.

Если в StartDate именно дата, а не дата/время, то попробуйте использовать в запросе таблицу tbl_BaseCalendar (в ней даты с 1950 по 2050 годы):

SELECT 
	SUM(D.Value),
	BC.WeekDayNumber
FROM tbl_Document D
JOIN tbl_BaseCalendar BC ON D.StartDate = BC.[Date]
GROUP BY BC.WeekDayNumber

Хотя, даже, если дата/время, то никто не мешает написать CustomSQLFilter.

1. А что мешает использовать группировку по datediff(day, 0, StartDate) вместо convert?

2. Для того что бы не использовать group by следует воспользоваться pratition by. Проблема с перечислением колонок после group by отпадает.

Здравствуйте Александр!
Вид я создал, а таблицу с тем же именем в Администраторе создать не могу, так как такой объект уже есть в базе, а сохранить таблицу без стуктуры тоже нельзя, нет такой возможности. Работать с видом запрос, созданный в Администраторе не может.

"Тюльпа Владимир" написал:

Здравствуйте Александр!

сохранить таблицу без стуктуры тоже нельзя, нет такой возможности


Владимир, не совсем вас понимаю. Какая у вас версия?

Здравствуйте Александр
Версия 3.2.1.14. Я смотрел демо-версию 3.4. Там бы этот вопрос не стоял.

Владимир, вам необходимо обратится в поддержку для получения обновлений до более новой версии 3.2.1

"Тюльпа Владимир" написал:Вид я создал, а таблицу с тем же именем в Администраторе создать не могу, так как такой объект уже есть в базе, а сохранить таблицу без стуктуры тоже нельзя, нет такой возможности. Работать с видом запрос, созданный в Администраторе не может.

Сначала создаем и сохраняем сервис таблицы в Terrasoft. Потом идем в базу, удаляем там получившуюся таблицу и создаем вьюху с тем же именем и теми же полями. На вьюху даем права на чтение всем нужным пользователям
Дальше обращаемся из TS запросами к нашей "таблице"

Спасибо!
Обновление сделал, нужная мне функция теперь есть. Вопрос снят.

Показать все комментарии