powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Динамический запрос, case
15 сообщений из 15, страница 1 из 1
Динамический запрос, case
    #39876814
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Имеется такой запрос.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT [ITEMID],
MAX(CASE WHEN [atrib] = 'Клиент' THEN [VALUE] ELSE NULL END) AS ATTR1,
MAX(CASE WHEN [atrib] = 'Заказ' THEN [VALUE] ELSE NULL END) AS ATTR2,
...
...
...
MAX(CASE WHEN [atrib] = '....' THEN [VALUE] ELSE NULL END) AS ATTRN,
FROM table1 as f
GROUP BY [ITEMID] 



Как сделать его динамическим?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE @quer nvarchar(max),
		@atrid1 nvarchar(max) = '''Клиент''',
		@artid2 nvarchar(max) = '''Заказ''',

                 ---@artidN nvarchar(max) = '''...''',

		@num int = 1;



SET @quer = 'SELECT [ITEMID],
MAX(CASE WHEN [atrib] = '+@atridN+' THEN [VALUE] ELSE NULL END) AS ATTRN,'

print @quer
exec sp_executesql  @quer



Заранее благодарю.
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39876815
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут, к сожалению, программист нужен, который умеет склеивать строки.
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39876818
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,
Не получится "колхозности" в духе?
Код: sql
1.
''+@atrid[case(@num as nvarchar)]+''


Через цикл
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39876977
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Earl11,

динамический запрос - это "колхозность" в принципе и используется только в безвыходных ситуациях, а не "для удобства".
Вы можете использовать переменные и без динамического запроса.
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877138
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,
В таком случае, как решить задачу?
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877151
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Earl11,

Как-то так
Код: sql
1.
2.
3.
4.
5.
6.
select
 'select [ITEMID], ' + 
 string_agg('max(case when [atrib] = ' + quotename(attr.v, '''') + ' then [VALUE] end as ATTR' + cast(attr.n as varchar(10)), ', ') within group (order by attr.n) +
 ' FROM table1 as f GROUP BY [ITEMID]'
from
 (values (1, 'Клиент'), (2, 'Заказ'), ..., (N, '...')) attr(n, v);


Если string_agg нету, то конкатенируйте через xml
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877169
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Earl11,

мне не совсем понятна идея использовать SQL сервер в качестве генератора запросов. Запросы можно формировать в клиентском приложении. И какая вообще преследуется цель.
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877242
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,
Смысл динамически создать таблицу т.к. количество атрибутов (atrib) велико и писать портянку для каждого MAX(CASE WHEN ....AS ATTR2 не очень хочется.
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877244
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
Спасибо. А иного пути нет? string_agg не поддерживается, с xml не особо знаком.
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877256
Ftt330
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Откройте курсор по списку атрибутов, вычитайте в цикле и сделайте склейку.
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877257
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Earl11,

понял, вы формируете динамический pivot.

https://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query , например.
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877363
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,
Большое спасибо, помогло. Медленно, но верно)
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877469
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ftt330,
Есть какой-нибудь пример, как это сделать?
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877591
Ftt330
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Earl11,


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
DECLARE @atrib varchar(50), @stmt varchar(max);  
DECLARE atrib_crs CURSOR FOR  
SELECT 'Клиент' AS atrib
UNION
SELECT 'Заказ';

SET @STMT = 'SELECT ';

OPEN atrib_crs;  

FETCH NEXT FROM atrib_crs  
INTO @atrib;  

WHILE @@FETCH_STATUS = 0  
BEGIN  
   SET @stmt = @stmt + 'CASE WHEN ATRIB = ''' + @atrib + ''' THEN VALUE END, ';
   FETCH NEXT FROM atrib_crs  
   INTO @atrib;
END  

CLOSE atrib_crs;  
DEALLOCATE atrib_crs;  

SET @stmt = SUBSTRING(@stmt, 1, LEN(@stmt) - 1) + ' FROM TABLE';

print @stmt;
GO  
...
Рейтинг: 0 / 0
Динамический запрос, case
    #39877876
Earl11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ftt330,
Большое спасибо
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Динамический запрос, case
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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