C# 中的 UDF 更新表(将所有数据与查询结果相除)
Posted
技术标签:
【中文标题】C# 中的 UDF 更新表(将所有数据与查询结果相除)【英文标题】:UDF in C# that updates a table (dividing all data with result of query) 【发布时间】:2011-10-23 23:08:17 【问题描述】:有没有办法将表的每个数据(所有列和行)除以
select count(*) from 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# 中我是这样做的:
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】:如果你事先知道这些列,那很容易:
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)
【讨论】:
以上是关于C# 中的 UDF 更新表(将所有数据与查询结果相除)的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server StoredProc 与 UDF 内联表
将查询部分与 Lucene 和数据库中的部分(MySQL)相结合