添加查询功能

时间:2011-08-14 21:08:40

标签: sql-server

我在SQL Server中有一些数据:

att1 att2 att3 att4 att5   ...   att205  
---------------------------------------
438  498  3625 3645 5000   ...   5000
438  498  3625 3648 5000   ...   5040
438  498  3625 3629 5000   ...   5330
437  501  3625 3626 5000   ...   5040
438  498  3626 3629 5000   ...   5050

我想知道每列数据总和的平方根,我这样做:

CREATE VIEW VIEW_myTable (ID, Value) AS (
            SELECT 1,  SQRT(SUM(att1)) FROM myTABLE
  UNION ALL SELECT 2,  SQRT(SUM(att2)) FROM myTABLE
  UNION ALL SELECT 3,  SQRT(SUM(att3)) FROM myTABLE
  UNION ALL SELECT 4,  SQRT(SUM(att4)) FROM myTABLE
  ...
  UNION ALL SELECT 205,  SQRT(SUM(att205)) FROM myTABLE
 ) FROM INFORMATION_SCHEMA.COLUMNS WHERE  TABLE_NAME = 'myTABLE'

还想ADD a extra result它吸引的行数 ...... 所以在上面的例子中有5行和205列。

如何在总结元素的同时利用扫描sql对表的影响?

所以我不会做另外的SELECT aka。

SELECT COUNT(*) FROM [myTABLE]

我想用更少的单词来扫描该查询中的表... 我想把某些东西像SUM(1)放在某个地方,但不知道在哪里......

我使用了FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTABLE',因为我正在做动态sql ......但查询看起来像......

---------------- EDIT ---------------------- < / p>

由@Neil Moss回答:

如果我有很多列,超过1024 ...... SQL不会支持这个...有没有办法克服这种情况?

1 个答案:

答案 0 :(得分:2)

如果您准备接受返回单行的查询,并为每个AttrX列添加一个SqrtSumAttrX列,那么动态构建以下内容就可以了:

select
    sqrt(sum(attr1)) as SqrtSumAttr1,
    sqrt(sum(attr2)) as SqrtSumAttr2,
    sqrt(sum(attr3)) as SqrtSumAttr3,
    ...
    sqrt(sum(attr205)) as SqrtSumAttr205,
    sum(1) as RowsScanned
from
    MyTable

这样可以只扫描一次表,而你问题中的样本会扫描205次 - 每次联合一次。

输入:

Attr1 Attr2 Attr3
1     2     3
4     5     6
7     8     9
10    11    12

输出:

SqrtSumAttr1      SqrtSumAttr2      SqrtSumAttr3      RowsScanned
4.69041575982343  5.09901951359278  5.47722557505166  4

接受后的EDIT

对于动态构造,请尝试以下方法:

declare @columns nvarchar(max)
declare @sql nvarchar(max)
set @columns = ''
select 
    @columns = @columns + 'sqrt(sum([' + [COLUMN_NAME] + '])) as SumSqrt' + [COLUMN_NAME] + ',' 
from 
    [INFORMATION_SCHEMA].[COLUMNS] 
where 
    TABLE_NAME = 'MyTable' 
    and 
    DATA_TYPE in ('int', 'decimal', 'float') -- numerics only (add other datatypes as needed)
order by 
    ORDINAL_POSITION 

set @sql = 'select ' + @columns + 'count(*) as RowsScanned from Results'

exec (@sql)

我使用Andriy M建议的count(*)而不是sum(1),因为如果不存在行,则返回0,而不是null。