UDF в C #, который обновляет таблицу (разделяя все данные с результатом запроса) - PullRequest
1 голос
/ 24 октября 2011

Есть ли способ разделить все данные таблицы (все столбцы и строки) на

select count(*) from table;

, например,

table

     a1  a2  a3   a4
   -------------------
    438 498 3625 3645
    500 291 5000 2351
    233 263 1298 1687
    198 117 1744 5932
    438 498 3625 3648
    500 291 5000 2637

изатем разделите каждый из них на 6, что является числом строк

     a1    a2   a3      a4
   ------------------------
   73.0  83.0 604.16  607.5
   83.33 48.5 833.33  391.83
   ...
   ...
   ...
   ...

Одна проблема заключается в том, что мои данные INT, но после преобразования они будут двойными ...

В c # Iделал:

int N = 0;
string sql = @"select count(*) from 'ExampleTable'";
N  = (int)cmd.ExecuteScalar();

int Columns = 0;
sql = @"select count(*) from information_schema.COLUMNS WHERE TABLE_NAME = 'ExampleTable'";

Columns  = (int)cmd.ExecuteScalar();


cmdLoad.CommandText = "SELECT * FROM [ExampleTable]";
int i,j;
double[,] newTable  = new double[N, Columns];
using (SqlDataReader reader = cmdLoad.ExecuteReader())
{
   while (reader.Read())
    {
        for ( i = 1; i <= N; j++)
        {
           for ( j = 1; j <= Columns; j++)
          {
              newTable[i,j] = reader.GetDouble((i*j) - 1) / N ;
          } //j  
        } //i
     }//reader
}

но я не уверен ...

1 Ответ

1 голос
/ 24 октября 2011

Если вы знаете столбцы заранее, это довольно просто:

SELECT 
    a1 / Rows As a1, 
    a2 / Rows As a2, 
    a3 / Rows As a3, 
    a4 / Rows As a4
FROM 
(
    SELECT *, CAST(COUNT(*) OVER (PARTITION BY NULL) as float) As Rows
    FROM ExampleTable
) Data

Если нет, вам нужно будет эффективно делать то, что вы делаете в C # - проходить по столбцам и строить динамическийзапрос

DECLARE @TableName varchar(100)
DECLARE @Query varchar(max)
SELECT @TableName = 'ExampleTable'
SELECT @Query = 'SELECT '
SELECT @Query = @Query + '[' + COLUMN_NAME + '] / Rows as [' + COLUMN_NAME + '], '
FROM information_schema.COLUMNS col WHERE TABLE_NAME = @TableName

SELECT @Query = @Query + 'Rows FROM ( SELECT *, CAST(COUNT(*) OVER (PARTITION BY NULL) as float) As Rows FROM [' + @TableName + ']) Data'
EXECUTE(@Query)
...