Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Аггрегация строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Veronika_B
TaPaK,

Мне нельзя использовать for xml path(''), Server 2000

и таких вьюх у вас тыщи?

Cammomile
оригинально, в данной ветке так точно
2 июн 17, 10:39    [20533775]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
Cammomile
DECLARE @Str varchar(max) = ''

DECLARE @TTT table ( i int , val varchar(200)) ;

INSERT iNTO @TTT SELECT 1, 'A'
INSERT iNTO @TTT SELECT 2, 'B'
INSERT iNTO @TTT SELECT 3, 'C'

SELECT @Str = @Str + val + ',' FROM @TTT

SELECT @Str


Данный пример уже приведен выше TaPaK .
он не подходит
2 июн 17, 10:44    [20533789]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
[quot TaPaK]
Veronika_B
TaPaK,

Мне нельзя использовать for xml path(''), Server 2000

и таких вьюх у вас тыщи?

Пока две, но плодить функции для каждого случая не охото.
Думала, что можно просто функцию универсальную с динамическим запросом, а не так все просто получилось.
2 июн 17, 10:48    [20533811]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
[quot Veronika_B]
TaPaK
пропущено...

и таких вьюх у вас тыщи?

Пока две, но плодить функции для каждого случая не охото.
Думала, что можно просто функцию универсальную с динамическим запросом, а не так все просто получилось.

я вам точно скажу любимую фразу: универсальные вещи, работают универсально плохо
2 июн 17, 10:53    [20533828]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Дайте ка подумать. Фор иксемель не подходит. В переменную складывать нельзя. Сервер 2000.

ОТВЕТ ОЧЕВИДЕН: COM
2 июн 17, 11:03    [20533862]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 327
Может быть как нибудь через рекурсию.

WITH t (CODE )
AS (SELECT 'a' 
	UNION ALL
	SELECT 'b' 
	UNION ALL
	SELECT 'c' 
)
,
list (CODE)
AS
(
	SELECT TOP (1)
			CONVERT(VARCHAR(20),t.code)
	FROM t
	UNION ALL
	SELECT 
		  CONVERT(VARCHAR(20), p.code + ';' + t1.code)	
	FROM list p
		CROSS APPLY 
		(
			SELECT  t.code,
					ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) N
			FROM t
			WHERE PATINDEX('%'+ t.code + '%',p.code) = 0
		) t1
	WHERE t1.N = 1			
)
SELECT *
FROM list
2 июн 17, 11:05    [20533880]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cristiano_Rivaldo,

угу, на 2к
2 июн 17, 11:08    [20533890]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Хотя, если для вьюхи, СОМ не поможет.

По моему тут пытаются решить задачу, которая вообще не в плоскости сервера лежит.


PS
1 Сделать таблицу
2 В таблицу джобом класть сложенные строки
3 Во вьюхе лезть в таблицу
??????
5 ВЫГОДА
2 июн 17, 11:09    [20533896]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Cammomile
Хотя, если для вьюхи, СОМ не поможет.

По моему тут пытаются решить задачу, которая вообще не в плоскости сервера лежит.


PS
1 Сделать таблицу
2 В таблицу джобом класть сложенные строки
3 Во вьюхе лезть в таблицу
??????
5 ВЫГОДА

no coment. В пятницу всех пустили на sql.ru :(
2 июн 17, 11:10    [20533903]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Не, нуачо?

Вот приходит человек в автомастерскую и говорит " Я хочу возить на машине лодку" Ему говорят "Ну это нужен прицеп, ну и тачка мощная потому, что лодка тяжелая". А он такой "не, так не пойдет. У меня только шевроле спарк, фаркопа нет, прицеп цеплять некуда. Ваше решение мне не подходит, дайте другое!"
Вот что ему скажут? Ему скажут "Машину нормальную купи!"

Так тут тоже самое "Я хочу функцию, и чтоб в динамике, и чтоб на S2k".
2 июн 17, 11:15    [20533930]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Я потому и попросил Веронику описать ЗАДАЧУ. Она, к сожалению, пока описывает не задачу, а СВОЕ ВИДЕНИЕ РЕШЕНИЯ.

Вот совсем грубо говоря. Она там решила, что ее ЗАДАЧА может быть решена через вьюху и конкатенацию строк. А может быть там надо нанять специально обученного пингвина и посадить щелкать клювом по клаве. Я, конечноЮ утрирую, но надеюсь идея понятна.
2 июн 17, 11:27    [20533968]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
Cammomile
Не, нуачо?

Вот приходит человек в автомастерскую и говорит " Я хочу возить на машине лодку" Ему говорят "Ну это нужен прицеп, ну и тачка мощная потому, что лодка тяжелая". А он такой "не, так не пойдет. У меня только шевроле спарк, фаркопа нет, прицеп цеплять некуда. Ваше решение мне не подходит, дайте другое!"
Вот что ему скажут? Ему скажут "Машину нормальную купи!"

Так тут тоже самое "Я хочу функцию, и чтоб в динамике, и чтоб на S2k".


Я просила совета, может есть функционал какой готовый и наработанный, а не хотелки мои. А "Машина" у заказчика такая, программистам выбирать не приходится зачастую.
2 июн 17, 11:29    [20533972]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Мы же не знаем какую задачу ты решаешь!
Функционалов миллиард, но почему именно конкатенация, именно во вьюще, именно через функцию?
Особенно когда ты так ограничена платформой.

И почему ты так упорно не хочешь делиться верхним уровнем проблемы?
2 июн 17, 11:32    [20533983]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
Cammomile
Мы же не знаем какую задачу ты решаешь!
Функционалов миллиард, но почему именно конкатенация, именно во вьюще, именно через функцию?
Особенно когда ты так ограничена платформой.

И почему ты так упорно не хочешь делиться верхним уровнем проблемы?


Данная вьюха используется в олапе.

На оракле я реализовала все без проблем, и там тоже самописная функция(через динамические запросы).
А опыта большого в MS-SQL не имею, поэтому обратилась сюда за помощью, так как моя реализация (динамика в функции не прокатила)
2 июн 17, 11:42    [20534037]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
А что надо сводить в строку? Какова частота обращения к вьюхе?
2 июн 17, 11:45    [20534060]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Veronika_B,

ваш вариант - функция для каждой таблицы.
2 июн 17, 11:51    [20534097]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
Cammomile
А что надо сводить в строку? Какова частота обращения к вьюхе?


Грубо говоря на этой вьюхе строиться отчет. По сути дела мне нужна группировка своеобразный SUM для строкового столбца.
2 июн 17, 11:54    [20534110]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
Veronika_B,

Столбец только один из каждой таблицы агрегировать нужно? Добавлять столбцы к таблицам можно?
2 июн 17, 11:56    [20534120]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
invm
Veronika_B,

Столбец только один из каждой таблицы агрегировать нужно?

Да, только один столбец
Добавлять столбцы к таблицам можно?


Структуру таблицы менять нельзя или вы имеете ввиду соединять таблицу с таблицей?
2 июн 17, 12:02    [20534150]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7758
Veronika_B,
зачем вам универсальность для единственной выборки. омг.
2 июн 17, 12:05    [20534166]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
При такой постановке вопроса, джоб который собирает агрегацию в табличку вполне решение.
2 июн 17, 12:15    [20534211]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Veronika_B
Member

Откуда:
Сообщений: 16
Буду писать функцию к конкретной таблице. Пока так.

Спасибо всем, что не оставили проблему без ответа
2 июн 17, 12:23    [20534253]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
Если уж совсем
Guest
Если уж совсем все плохо. То есть кривой вариант скалярной функции с циклом
2 июн 17, 12:24    [20534261]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Если уж совсем
Если уж совсем все плохо. То есть кривой вариант скалярной функции с циклом

и с динамикой опять же, зачем нам упрощать запрос в одну строку, давайте цикл
2 июн 17, 12:27    [20534283]     Ответить | Цитировать Сообщить модератору
 Re: Аггрегация строк  [new]
invm
Member

Откуда: Москва
Сообщений: 9347
Veronika_B,

Можете примерно так сделать:
+
use tempdb;
go

create table dbo.Table1(id int identity primary key, cr1 int, Value1 int);
create table dbo.Table2(id int identity primary key, cr2 varchar(10), Value2 varchar(100));
go

create function dbo.fnGetTableData
(
 @TableName sysname,
 @cr sql_variant
)
returns table
as
return (
 select
  cast(Value1 as varchar(8000)) as Value
 from
  dbo.Table1
 where
  @TableName = N'dbo.Table1' and cr1 = @cr

 union all

 select
  cast(Value2 as varchar(8000))
 from
  dbo.Table2
 where
  @TableName = N'dbo.Table2' and cr2 = @cr
)
go

create function dbo.fnStringConcat
(
 @TableName sysname,
 @cr sql_variant
)
returns varchar(8000)
as
begin
 declare @result varchar(8000);

 select @result = '';

 select
  @result = @result + case when @result = '' then '' else ', ' end + Value
 from
  dbo.fnGetTableData(@TableName, @cr);

 return @result; 
end
go

insert into dbo.Table1 (cr1, Value1) select 1, 1 union all select 1, 2;
insert into dbo.Table2 (cr2, Value2) select 'a', '01234' union all select 'a', '56789';
go

declare @t table (n sysname, cr sql_variant);
insert into @t select N'dbo.Table1', cast(1 as sql_variant) union all select N'dbo.Table2', 'a';

select
 n, dbo.fnStringConcat(n, cr)
from
 @t;
go

drop function dbo.fnGetTableData, dbo.fnStringConcat;
drop table dbo.Table1, dbo.Table2;
go
2 июн 17, 12:41    [20534337]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить