Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2013, 18:07   #1
BioVR
Пользователь
 
Регистрация: 21.02.2011
Сообщений: 18
По умолчанию Динамическое имя в GROUP BY

Всем доброго дня!
Возникла проблема в определении динамического столбца:
Код:
			declare @Выбор as varchar(100)
			declare @Язык as int
			set @язык=0
			set @Выбор='Федеральный округ'
			declare @ФактВыбор as varchar(100)
			if @Выбор='Федеральный округ' set @ФактВыбор='[Федеральный округ]'
select * from (
		(select @ФактВыбор as Выбор, ArchiveName as Период, Подгруппа, Бренд, [Наименование позиции] as SKU, count([Тов запас]) as [Кол риск TT]	
		 from #TestTab 
		 group by @ФактВыбор, ArchiveName, Подгруппа, Бренд, [Наименование позиции]
		 Having count([Тов запас])=0
		) ValueTab left outer join
		(select @ФактВыбор, ArchiveName, count(distinct ТТ) as [Кол ТТ] from (
		SELECT     	Kotex.Анкета.ТТ, Kotex.ТТ_языки.[Федеральный округ], Kotex.ТТ_языки.Край, Kotex.ТТ_языки.Город, Kotex.ТТ_языки.Формат, Kotex.ТТ_языки.Категория, 
                    Kotex.ТТ_языки.[Название сети], Kotex.ТТ_языки.Район, Kotex.ТТ_языки.Язык, Kotex.Анкета.Status, Kotex.Анкета.ArchiveName
		FROM        Kotex.Анкета INNER JOIN
                    Kotex.ТТ_языки ON Kotex.Анкета.ТТ = Kotex.ТТ_языки.Id
		WHERE		(Kotex.ТТ_языки.Язык in (@Язык)) and Kotex.Анкета.Status='Принята') as CountPoint
		group by ('Kotex.ТТ_языки.'+@ФактВыбор), Kotex.Анкета.ArchiveName
		) as CountTab ON ('ValueTab.'+@ФактВыбор)=('CountTab.'+@ФактВыбор) and ValueTab.ArchiveName=CountTab.ArchiveName)
Проблема возникает в первом же GROUP BY
Сообщение 164, уровень 15, состояние 1, строка 10
Each GROUP BY expression must contain at least one column that is not an outer reference.

Как это можно обойти? Очень нужно, чтобы первая графа определялась динамически для оператора GROUP BY.
Возможно я как то криво определил имя столбца?
BioVR вне форума Ответить с цитированием
Старый 19.04.2013, 18:36   #2
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

что не понятно в ошибке?

так запросы работать не буду, это же код, а вы из него неизвестно что делаете.
eval вне форума Ответить с цитированием
Старый 19.04.2013, 18:54   #3
BioVR
Пользователь
 
Регистрация: 21.02.2011
Сообщений: 18
По умолчанию

Не понятно как сделать столбец динамическим, чтобы имя столбца определялось через @ФактВыбор
Нашел один вариант - через объявление @sql
Код:
DECLARE @sql nvarchar(max) = 'SELECT ' + @columnname + ' FROM Table_1';
exec sp_executesql @sql, N''
Это единственный вариант для объявления динамического столбца?
BioVR вне форума Ответить с цитированием
Старый 19.04.2013, 19:32   #4
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

в селекте - да, единственный.
eval вне форума Ответить с цитированием
Старый 19.04.2013, 20:42   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

вернее можно, но с извращением..
да и ваще, дин. запросы это либо специфика, либо кривость.
специфика бывает редко, остается кривость
eval вне форума Ответить с цитированием
Старый 22.04.2013, 14:11   #6
BioVR
Пользователь
 
Регистрация: 21.02.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
вернее можно, но с извращением..
И все таки, какие варианты? Получилось написать все как надо, но возникла другая проблема - Report Server при формировании запроса не может получить набор полей из процедуры, а процедура такая:
Код:
set @sql = 'select Выбор, Период, Подгруппа, Бренд, SKU, [Кол риск TT], [Кол ТТ] from (
  (select ' + @ФактВыбор +' as Выбор, ArchiveName as Период, Подгруппа, Бренд, [Наименование позиции] as SKU, (count([Тов запас])-SUM(cast([Тов запас] as int))) as [Кол риск TT] 
   from #TestTab 
   group by ArchiveName, ' + @ФактВыбор + ', Подгруппа, Бренд, [Наименование позиции]
  ) ValueTab INNER JOIN
  (select ArchiveName, ' + @ФактВыбор + ', count(distinct ТТ) as [Кол ТТ] from #TestTab2		
   group by ArchiveName, ' + @ФактВыбор + '
  ) as CountTab ON (ValueTab.Выбор)=(CountTab.' + @ФактВыбор + ') and ValueTab.Период=CountTab.ArchiveName)
  	union all
		(select Выбор, Период, Подгруппа, Бренд, SKU, [Кол риск TT], [Кол ТТ] from (
		 select ''яяИтого'' as Выбор, ArchiveName as Период,  Подгруппа, Бренд, [Наименование позиции] as SKU, (count([Тов запас])-SUM(cast([Тов запас] as int))) as [Кол риск TT]
		 from #TestTab
		 group by ArchiveName, Подгруппа, Бренд, [Наименование позиции]) ValueTabTotal INNER JOIN
		 (select ArchiveName, count(distinct ТТ) as [Кол ТТ] from #TestTab2	
		  group by ArchiveName
		  ) as CountTabTotal ON ValueTabTotal.Период=CountTabTotal.ArchiveName) 
  '
exec sp_executesql @sql
В итоге в наборе данных пустота и собрать отчет на его основе не получается...
Есть идеи?
BioVR вне форума Ответить с цитированием
Старый 22.04.2013, 14:22   #7
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Цитата:
Есть идеи?
есть конечно, в базе нет данных удовлетворяющим условиям запроса
да и запрос страшный сам по себе
eval вне форума Ответить с цитированием
Старый 22.04.2013, 14:30   #8
BioVR
Пользователь
 
Регистрация: 21.02.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
есть конечно, в базе нет данных удовлетворяющим условиям запроса
да и запрос страшный сам по себе
Как интересно их может не быть, если отработанный запрос в SQL все возвращает как надо, а в RB даже набор полей получить не может - просто пустота.
Или мой вопрос не понятен?
BioVR вне форума Ответить с цитированием
Старый 22.04.2013, 14:42   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

почему не может? может, но ему надо указать поле которое тянете - @ФактВыбор и временные таблицы чтоб были готовы, а из астрала он да, не умеет брать
но это не приведет к толку.. я ж сказал криво у вас вот и не работает, вы бы пояснили что тут творится, может и подсказали как надо,
пока я вижу что спроектировали что-то не правильно
что можно побыстрому сделать: исправить запросы чтобы возвращали все поля которые могут быть в @ФактВыбор, а уже в репорте регулировать видимость колонок, или чего там у вас, да и ваще запросы надо "оттюнить", поубирать все лишнее ...
eval вне форума Ответить с цитированием
Старый 22.04.2013, 15:25   #10
BioVR
Пользователь
 
Регистрация: 21.02.2011
Сообщений: 18
По умолчанию

Нужно как то задать динамическое определение имени столбца.
К примеру, вот кусок кода
Код:
select @ФактВыбор as Выбор, ArchiveName as Период, Подгруппа, Бренд, [Наименование позиции] as SKU, (count([Тов запас])-SUM(cast([Тов запас] as int))) as [Кол риск TT] 
   from #TestTab 
   group by ArchiveName, @ФактВыбор, Подгруппа, Бренд, [Наименование позиции]
Где @ФактВыбор динамичен и может быть равен одному из 6 разных столбцов, к примеру [Федеральный округ] или [Название сети]

Я попробовал написать код с применением exec sp_executesql @sql, который успешно работает в SQL Management Studio, но данный код не воспринимается Report Builder - не возвращает набор полей, получаемых из запроса.
При этом прямое указание @ФактВыбор как в примере выше не работает как определение имени столбца.

Вот и задача такова, что нужно как задавать динамически имя столбца, при этом не используя sp_executesql (или чего то подобного)
BioVR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
group by ts-alan C# (си шарп) 2 21.03.2013 21:22
Узнать имя листа, если известно кодовое имя tae1980 Microsoft Office Excel 3 20.03.2011 21:57
Group by and Having Progsenya SQL, базы данных 1 19.02.2011 19:18
GROUP BY Syltan SQL, базы данных 1 03.11.2009 13:39