Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Суммирование в запросе  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
Доброго времени суток господа! Помогите пожалуйста со следующей задачей:
Есть таблица1 TBL1, таблица2 TBL2.
TBL1:
IDFLD1FLD2FLD3FLD4FLD5FLD6FLD7
13111511
........................
NNNNNNNN

TBL2:
ID_TBL2FLD_NAMES1
1FLD1FLD2+FLD3+FL4
2FLD5FLD2+FLD3+FLD4+FLD6+FLD7

То есть в TBL2 содержится информация о настройках суммирования полей из TBL1. На клиенте при помощи TBL2 формируется запрос
типа:
SELECT FLD2+FLD3+FL4 AS SM1,FLD2,FLD3,FLD4,FLD2+FLD3+FLD4+FLD6+FLD7 AS SM2,FLD6,FLD7

Формирование запроса выполняется в коде, заметно тормозит процесс работы с приложением. Как можно наиболее оптимально организовать данный процесс,ведь у каждого пользователя набор полей FLD1...FLDN и настройки суммирования разные, хранятся в TBL2, т.е. нет возможности без вышеперечисленных манипуляций создать итоговый запрос.
28 май 12, 07:35    [12623543]     Ответить | Цитировать Сообщить модератору
 Re: Суммирование в запросе  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
nickolay_fff
SELECT FLD2+FLD3+FL4 AS SM1,FLD2,FLD3,FLD4,FLD2+FLD3+FLD4+FLD6+FLD7 AS SM2,FLD6,FLD7

Как можно наиболее оптимально организовать данный процесс,ведь у каждого пользователя набор полей FLD1...FLDN и настройки суммирования разные, хранятся в TBL2, т.е. нет возможности без вышеперечисленных манипуляций создать итоговый запрос.

Отчего же
1. ХП с динамической генерацией запроса .
2. Каждому пользователю по схеме и динамическое создание представления в нём
3. Супер-пупер мега вью с обработкой всех возможных суммирований.
4. На клиенте сгенерить запрос и отдать серверу.

автор
Формирование запроса выполняется в коде

Это 4ре ? Вообще не понятно тогда, что значит выполняется медленно, ведь это не будет отличаться от 1 и 2 ?
28 май 12, 07:50    [12623567]     Ответить | Цитировать Сообщить модератору
 Re: Суммирование в запросе  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
много кода получилось, поэтому тормозит сам клиент, да еще и связь с серверов не у всех хорошая... Запрос естественно гораздо сложнее, чем я привел в примере. На сервере выполняется хранимка с параметрами для каждого. Но вот с суммированием хотелось бы отказаться от программного кода.
28 май 12, 07:58    [12623585]     Ответить | Цитировать Сообщить модератору
 Re: Суммирование в запросе  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
nickolay_fff,

with T1 as
(
select * from
(values
((1),(2),(2),(1),(7),(5),(5),(9),(5)),
((2),(2),(2),(1),(7),(6),(4),(8),(4)),
((3),(3),(3),(2),(6),(7),(3),(7),(3)),
((4),(3),(3),(2),(6),(6),(2),(6),(2)),
((5),(4),(4),(3),(5),(5),(3),(3),(3)),
((6),(4),(4),(3),(5),(4),(4),(8),(4))
)x(ID,F1,F2,F3,F4,F5,F6,F7,F8)
)

,T2 as
(
select * from
(values
((1),('F1'),('F1+F2')),
((2),('F3'),('F1+F2+F3')),
((3),('F5'),('F5+F6')),
((4),('F7'),('F8+F7'))
)x(ID,NAME,S)
)

,T2_S AS(
select 
  MAX(CASE WHEN NAME='F1'THEN S END)F1, 
  MAX(CASE WHEN NAME='F2'THEN S END)F2, 
  MAX(CASE WHEN NAME='F3'THEN S END)F3, 
  MAX(CASE WHEN NAME='F4'THEN S END)F4, 
  MAX(CASE WHEN NAME='F5'THEN S END)F5, 
  MAX(CASE WHEN NAME='F6'THEN S END)F6, 
  MAX(CASE WHEN NAME='F7'THEN S END)F7, 
  MAX(CASE WHEN NAME='F8'THEN S END)F8 
from T2
)

,UNPVT AS(
select ID, NAME, VALUE
from T1
UNPIVOT (
VALUE FOR NAME IN(F1,F2,F3,F4,F5,F6,F7,F8)
)unpvt
)


select ID, 
  COALESCE(
    SUM(CASE WHEN '+'+F1+'+' LIKE '%+'+NAME+'+%' THEN VALUE END),
    MAX(CASE WHEN NAME='F1'THEN VALUE END)
  )F1,
  COALESCE(
    SUM(CASE WHEN '+'+F2+'+' LIKE '%+'+NAME+'+%' THEN VALUE END),
    MAX(CASE WHEN NAME='F2'THEN VALUE END)
  )F2,
  COALESCE(
    SUM(CASE WHEN '+'+F3+'+' LIKE '%+'+NAME+'+%' THEN VALUE END),
    MAX(CASE WHEN NAME='F3'THEN VALUE END)
  )F3,
  COALESCE(
    SUM(CASE WHEN '+'+F4+'+' LIKE '%+'+NAME+'+%' THEN VALUE END),
    MAX(CASE WHEN NAME='F4'THEN VALUE END)
  )F4,
  COALESCE(
    SUM(CASE WHEN '+'+F5+'+' LIKE '%+'+NAME+'+%' THEN VALUE END),
    MAX(CASE WHEN NAME='F5'THEN VALUE END)
  )F5,
  COALESCE(
    SUM(CASE WHEN '+'+F6+'+' LIKE '%+'+NAME+'+%' THEN VALUE END),
    MAX(CASE WHEN NAME='F6'THEN VALUE END)
  )F6,
  COALESCE(
    SUM(CASE WHEN '+'+F7+'+' LIKE '%+'+NAME+'+%' THEN VALUE END),
    MAX(CASE WHEN NAME='F7'THEN VALUE END)
  )F7,
  COALESCE(
    SUM(CASE WHEN '+'+F8+'+' LIKE '%+'+NAME+'+%' THEN VALUE END),
    MAX(CASE WHEN NAME='F8'THEN VALUE END)
  )F8
from UNPVT, T2_S
group by ID
28 май 12, 08:17    [12623632]     Ответить | Цитировать Сообщить модератору
 Re: Суммирование в запросе  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
pegoopik,

Привет производительности.
28 май 12, 08:30    [12623676]     Ответить | Цитировать Сообщить модератору
 Re: Суммирование в запросе  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
Ken@t,

:)

зато весело
28 май 12, 08:32    [12623681]     Ответить | Цитировать Сообщить модератору
 Re: Суммирование в запросе  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
Динамически такую штуку сваять сложновато будет наверно... Теоретически я так предполагал: у каждого пользователя набор полей FLD1...FLDN (у всех он разный), свои настройки суммирования (в TBL2 для каждого прописаны), т.е анализируются грубо говорся названия полей в полученном наборе для конкретного пользователя на предмет того, не являются ли они суммируемыми. Т.е клиент получил набор FLD1,FLD2,FLD3, глянул в TBL2, там для данного пользователя прописано, что поле FLD1=FLD2+FLD3, итоговый запрос получился
SELECT FLD2+FLD3 AS SM1,FLD2,FLD3 FROM TBL1
.
28 май 12, 08:47    [12623724]     Ответить | Цитировать Сообщить модератору
 Re: Суммирование в запросе  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
nickolay_fff,
DECLARE @SM TABLE  
(
  SummName varchar(12)
  ,Expression varchar(64) 
)
DECLARE @TSQL varchar(max)
INSERT @SM (SummName,Expression) VALUES ('F1','F2+F3') 




CREATE TABLE #T
(
  F1 int 
  ,F2 int
  ,F3 int
)

INSERT #T(F1,F2,F3) VALUES (1,2,3)
INSERT #T(F1,F2,F3) VALUES (3,4,5)


SET @TSQL = 'SELECT F1, F2, F3 FROM #T'

SELECT @TSQL = REPLACE( @TSQL, T.SummName, Expression + ' AS '+ T.SummName) FROM @SM T


PRINT @TSQL 
EXEC (@TSQL )


DROP TABLE #T
28 май 12, 09:04    [12623765]     Ответить | Цитировать Сообщить модератору
 Re: Суммирование в запросе  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
nickolay_fff
SELECT FLD2+FLD3+FL4 AS SM1,FLD2,FLD3,FLD4,FLD2+FLD3+FLD4+FLD6+FLD7 AS SM2,FLD6,FLD7


Внимательно посмотрел, у вас , что для каждого клиента разный кортеж данных?
Если это так то, это очень плохое решение вынести в единую процедуру или представление.
28 май 12, 09:14    [12623793]     Ответить | Цитировать Сообщить модератору
 Re: Суммирование в запросе  [new]
nickolay_fff
Member

Откуда:
Сообщений: 378
Благодарю за помощь и советы. Просто пока ковыряюсь с базой, ищу более оптимальные решения, оптимизирую.
28 май 12, 10:22    [12624160]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить