Управляйте значениями таблицы, присваивайте их переменному числу @vars, используйте курсор, сводку ... объединение? - PullRequest
0 голосов
/ 05 февраля 2011

Я получил в результате динамического запроса таблицу только с одной строкой, в которой есть 1 столбец + d + n столбцов, поэтому проблема в том, что число 'd' и 'n' является переменным, поэтому я могесть строка с 5,6,7, .. d значениями и 10,11 .... n значениями или более ...

как

Input:
x     f1       f2         f3       ... fd        Other1     Other2    Other3   ... Othern
10    1.0000   139.0000   60.0000  ... 59.0000   846.0000   30.1000   0.3980   ... 0.398

Если мне нужносделать некоторое исчисление с, скажем, n, f1, Other1 для первого столбца;n, f1, f2, Other1, Other2 для столбца 2, n, f1, f3, Other1, Other3 для третьего столбца ... другой таблицы, например:

Column_1                  Column_2                   Column_3                ..Column_d  
x*(f1*f1)/(Other1*Other1) x*(f1*f2)/(Other1*Other2) x*(f1*f3)/(Other1*Other3)..x*(f1*fn)/(Other1*Othern)
x*(f2*f1)/(Other2*Other1) x*(f2*f2)/(Other2*Other2) x*(f2*f3)/(Other2*Other3)..x*(f2*fn)/(Other2*Othern)     ...
 ...
x*(fd*f1)/(Otherd*Other1) x*(fd*f2)/(Otherd*Other2) x*(fd*f3)/(Otherd*Other3)..x*(fd*fn)/(Otherd*Othern)

Я думал сначала сохранить столбцычто мне нужно во вложенном цикле, и обновлять его, пока я не достигну конца таблицы.но так как мне нужно сделать это d раз, я немного запутался, поэтому мои вопросы:

  • Могу ли я использовать курсор для получения результата?
  • Могу ли я выбратьвсе переменные в первую очередь, чтобы сделать это?
  • Использование сводки должно сделать трюк, Как?
  • Не знаю, и главная проблема в том, что входная таблица имеет d динамических столбцов

Я пытаюсь сделать хранимую процедуру, но мне не повезло, динамическое построение SQL-запроса в коде перед выполнением.Заранее спасибо.

Надеюсь, вопрос более понятен.спасибо PS.X - это еще один вход, поэтому он не имеет ничего общего с элементами 'n' в столбцах Other1 ... Othern

-------------- EDIT-----------------

Чтобы сгенерировать входную таблицу из одной строки: я использую динамический запрос для выбора различных полей, так как они являются динамическими, я используюстрока, которая будет заменена позже, поэтому общий код:

SET @template = 'SELECT SUM(1) AS x,{f}, {other} FROM '+ @table_name
--then in some loops I calculate sums, powers, etc...
--so after I replace the strings with cosen queries I replace them like 
SET @template = REPLACE(@template, '{f}'    , @dynamicStringForf )
SET @template = REPLACE(@template, '{Other}', @dynamicStringForOther  )
--Finally I get large query with the objetive I need
--something like:
'SELECT SUM(1) AS x, sum(a+b) as f1,pow(b,c) as f2....,sum(x+y) as Other1 ,pow(y+z) as Other 2... FROM '+ @table_name 

the result is a one row with data like:


    x     f1       f2         f3       ... fd        Other1     Other2    Other3   ... Othern
    10    1.0000   139.0000   60.0000  ... 59.0000   846.0000   30.1000   0.3980   ... 0.398 

Now I have created a new temp table dynamically
--@d could be any number, but at this stage I know it

Set @TempColumn = ''        
Set @TempCol    = ''
Set @Comma  = ''
Set @ColumnNo   = 1
Set @SQL = 'Create Table temp ('
    WHILE @ColumnNo <= @d Begin
      Set @TempColumn =@TempColumn  + @Comma + ' Column_' + Cast(@ColumnNo as nvarchar)
      Set @SQL        =@SQL + @Comma + ' Column_' + Cast(@ColumnNo as nvarchar) + ' FLOAT'
      Set @Comma      = ','
      Set @ColumnNo   = @ColumnNo + 1       
   END
Set @SQL = @SQL + ' )'
EXEC (@SQL)  --create temp table

--the result is a new table like:

    Column_1      Column_2    Column_3 ... Column_d  

Теперь я хочу заполнить ее, что-то вроде:

Column_1                  Column_2                   Column_3                ..Column_d  
x*(f1*f1)/(Other1*Other1) x*(f1*f2)/(Other1*Other2) x*(f1*f3)/(Other1*Other3)..x*(f1*fn)/(Other1*Othern)
x*(f2*f1)/(Other2*Other1) x*(f2*f2)/(Other2*Other2) x*(f2*f3)/(Other2*Other3)..x*(f2*fn)/(Other2*Othern)     ...
 ...
x*(fd*f1)/(Otherd*Other1) x*(fd*f2)/(Otherd*Other2) x*(fd*f3)/(Otherd*Other3)..x*(fd*fn)/(Otherd*Othern)

Любая идея, как это сделать, объединение,курсор, поворот, что может быть лучше

1 Ответ

1 голос
/ 05 февраля 2011

SQL действительно хорош для работы с наборами данных - как вы хотите, если эти данные хранятся в виде строк.

Я думаю, что лучший способ решить эту проблему - преобразовать данные в таблицу с двумя столбцами (один столбец, содержащий значения f, а второй столбец, содержащий значения other), с строками D.

Тогда решение довольно простое (оператор объединения и разворота).

Еще лучше - переписать предыдущий запрос, чтобы получить данные в этом формате. (У вас есть предыдущий запрос - я мог бы показать вам, как это сделать.


Ну, чтобы сгенерировать строку, которую я описал, у меня есть что-то вроде:

SET @template = 'SELECT SUM(1) AS N,{f}, {other} FROM '+ @table_name

тогда я заменяю в цикле нужные мне поля,

SET @template = REPLACE(@template, '{f}' , @f) 
SET @template = REPLACE(@template, '{other}', @other)

Я не понимаю, как это работает ... похоже, вы просто выбираете переменные - это имена столбцов переменных? Пожалуйста, уточните - я уверен, что есть лучший способ построить этот запрос.


Не могли бы вы объяснить, как сделать это объединение и описать опорный пункт?

Если я использую сводную диаграмму, как изменить выбранные столбцы, чтобы вычислить термины, как я описал?

Я буду знать, когда мы точно знаем, как выглядит ваша структура данных, мне нужно кое-что проверить.


f имеет данные d, а Other имеет n, если я помещу значения в таблицу из 2 столбцов, как мне обращаться с n> d, и много нулей в столбце d ??

Часто, когда у вас много нулей, вы используете group by, чтобы "сжать" строки вниз.

...