我在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不会支持这个...有没有办法克服这种情况?
答案 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。