Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Dezmond Member Откуда: Москва Сообщений: 323 |
В общем, такая проблема: надо сгруппировать выборку по полю, получаемому в результате подзапроса. Поиск что-то ничего не дал. Есть похожие проблемы у других, но не совсем. Есть запрос из нескольких таблиц, со сложной логикой подзапроса, в котором вытягиваются названия пользователей: SELECT ef.eMapName, iss.cmb_Shop, em.eLocaleID, (SELECT [eUserName] FROM xxx WHERE eAttribute = 'Department' AND eValue = eg.cmb_Dep INTERSECT SELECT [eUserName] FROM xxx WHERE eAttribute = 'Shop' AND eValue = eg.cmb_Shop INTERSECT SELECT [eUserName] FROM xxx WHERE eAttribute = 'Subdepartment' AND eValue = eg.cmb_Subdep) as users, ef.EFOLDERID --COUNT(*) TOTAL, --SUM(case when ef.eArchived = 1 then 1 else 0 end) end, --SUM(case when iss.DT_Termin > Sysdatetime() then 1 else 0 end) over, --SUM(case when iss.int_Status = 1 then 1 else 0 end) issued, --SUM(case when iss.int_Status > 1 and iss.int_Status < 5 then 1 else 0 end) work, --SUM(case when es.eStagename = 'GS_Escalation' then 1 else 0 end) escal FROM [Metastorm].[dbo].eFolder AS ef INNER JOIN [Metastorm].[dbo].eMap AS em ON ef.eMapName = em.eMapName INNER JOIN [Metastorm].[dbo].eStage AS es ON ef.eMapName = es.eMapName em.eMapName = es.eMapName INNER JOIN [Metastorm].[dbo].Issues AS iss ON ef.eFolderID = eg.eFolderID WHERE em.eLocaleID = 'Default' AND ef.eStageName IS NOT NULL AND es.eLocaleID = 'Default' AND is.cmb_Shop = 'YYYYYY' --GROUP BY --ef.eMapName, --iss.cmb_Shop, --em.eLocaleID --ea.eUserName Необходимо сгрупиировать по полю users. Потому что, если не сгруппировать, то ругаеццо, есессно, так как поле есть в select clause А если сгруппировать, то ругаеццо, что не находит поле users Пробовал и через CTE делать, и через конструкцию SELECT * FROM (SELECT ef.eMapName, eg.cmb_Shop, em.eLocaleID, (SELECT [eUserName] INTERSECT... SELECT [eUserName]...) as users ) GROUP BY ...users Все без толку. Везде ругается на синтаксис. Как такое реализовать? |
17 фев 14, 18:08 [15578941] Ответить | Цитировать Сообщить модератору |
WarAnt Member Откуда: Питер Сообщений: 2423 |
Dezmond, Убирайте ваш подзапрос в outer apply и группируйте |
17 фев 14, 18:19 [15578986] Ответить | Цитировать Сообщить модератору |
Dezmond Member Откуда: Москва Сообщений: 323 |
Но при outer apply надо создавать табличную функцию, полномочий на создание которой нет. Другие варианты решения? |
||
18 фев 14, 11:54 [15581325] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
С чего вдруг "надо"? |
||
18 фев 14, 11:56 [15581341] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Вложенные запросы select tab_name, col_name from ( select name as tab_name, (select top 1 name from syscolumns b where a.id = b.id) as col_name from sysobjects a) x group by tab_name, col_name |
||
18 фев 14, 12:00 [15581374] Ответить | Цитировать Сообщить модератору |
Dezmond Member Откуда: Москва Сообщений: 323 |
Ну, по крайней мере, я только такие примеры с apply видел. |
||
18 фев 14, 12:03 [15581405] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
От "Я видел только это" до "надо" очень большое расстояние |
||
18 фев 14, 12:06 [15581436] Ответить | Цитировать Сообщить модератору |
Dezmond Member Откуда: Москва Сообщений: 323 |
UPD: полномочия есть, но все-таки интересно, как такое сделать дедовскими методами. На MS SQL <2005, например.
Хм, такой синтаксис пробовал, но ругалось. Надо еще раз попробобовать - может где ошибся. |
||
18 фев 14, 12:09 [15581460] Ответить | Цитировать Сообщить модератору |
Dezmond Member Откуда: Москва Сообщений: 323 |
Glory,
Благодарствую. Вот так получилось. Руки мои кривые ![]() |
||||
18 фев 14, 12:35 [15581651] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |