Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在while函数中增加列序号位置?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何在while函数中增加列序号位置?

Sql 如何在while函数中增加列序号位置?,sql,sql-server,tsql,Sql,Sql Server,Tsql,摘要:我有一个包含多列的表,我正在尝试对所有列实现while循环函数,以提取每列的平均值 我将其编码为每个列都有一个数字,以减少使用增量方法的可能性 Declare @tablename as varchar(128) Declare @column1 as varchar(128) Delect @tablename = 'MOMENTUM_Results' Select @column1 = sc.name from sysobjects as so inner join syscolum

摘要:我有一个包含多列的表,我正在尝试对所有列实现while循环函数,以提取每列的平均值

我将其编码为每个列都有一个数字,以减少使用增量方法的可能性

Declare @tablename as varchar(128)
Declare @column1 as varchar(128)
Delect @tablename = 'MOMENTUM_Results'

Select @column1 = sc.name
from sysobjects as so inner join syscolumns as sc on so.id = sc.id 
where so.name = @tablename and sc.colid = 2
当我打印这段代码时,它会根据我输入的从1到122的数字打印列的名称

循环函数的代码:

但我绝对不知道如何将此函数集成到循环中,因此函数会逐个遍历所有列,因此我想寻求一些建议

谢谢大家!

R.H


如果可以避免的话,不要使用循环或光标。程序性思维的魔鬼正在把你从基于设置的方法的光中拉出来,深深地陷入痛苦和痛苦之中


我预先知道列名,我这样做只是为了简化循环遍历每一列的方式

不!这并不是在缓解问题,而是在惩罚性能不佳的发动机:-

你要找的是这个吗

CREATE TABLE dbo.Test(ID INT, VAl1 DECIMAL(14,4), Val2 DECIMAL(14,4), Val3 DECIMAL(14,4));
GO
INSERT INTO dbo.Test VALUES(1,1,10,100),(2,2,20,200),(3,3,30,300);
GO
    SELECT AVG(Val1) AS Avg1,AVG(Val2) AS Avg2,AVG(Val3) AS Avg3
    FROM dbo.Test;
GO
DROP TABLE dbo.Test;
结果

Avg1        Avg2        Avg3
2.000000    20.000000   200.000000
,AVG(ID) AS [AVG_ID],AVG(VAl1) AS [AVG_VAl1],AVG(Val2) AS [AVG_Val2],AVG(Val3) AS [AVG_Val3]
使现代化 如果你只是想偷懒,避免打字,你可以尝试以下方法:

SELECT ',AVG(' + COLUMN_NAME + ') AS ' + QUOTENAME('AVG_' + COLUMN_NAME)   
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA='dbo' AND TABLE_NAME='Test'
FOR XML PATH('')
结果

Avg1        Avg2        Avg3
2.000000    20.000000   200.000000
,AVG(ID) AS [AVG_ID],AVG(VAl1) AS [AVG_VAl1],AVG(Val2) AS [AVG_Val2],AVG(Val3) AS [AVG_Val3]
使用此技巧,您可以非常轻松地构建硬编码语句:-

首先将该表中的所有列名放入临时tabletemp 数一数columns@count_of_columns在那种诱惑下。 声明一个变量@count=1 将while循环声明为While@count使用以下查询在while循环中逐个获取列名

SET @column1=(select top 1 column1 from 
(select Row_number()over (order by column1) as r_n_n, column1                  
from #temp) aa 
where r_n_n >=@Count)
->在这里使用实际代码

->递增@count变量

set @count = @count + 1

您是否可以将SELECT从sys.Columns移动到WHILE循环的主体中,以获得您要查找的对象?像这样的

DECLARE @TABLENAME AS VARCHAR(128);
DECLARE @COLUMN1 AS VARCHAR(128);
DECLARE @COUNTER INT;
SET @TABLENAME = 'MOMENTUM_Results';
SET @COUNTER = 1;

WHILE ....
BEGIN

    SELECT @COLUMN1 = C.Name
    FROM sys.Columns C
    WHERE OBJECT_NAME(C.object_id) = @TABLENAME 
    AND C.column_id = @COUNTER
    ;
    SET @SQL = 'SELECT AVG(MR.[' + @COLUMN1 + ']) From MOMENTUM_Quintile MQ 
    Left Join MOMENTUM_Returns MR on MQ.Mnemonic = MR.Mnemonic WHERE MQ.[' + @COLUMN1 + '] = 1';

    ... Other Stuff ...

    SET @COUNTER = @COUNTER + 1;

END
;
也许我没有完全理解你的问题,但是如果你已经把所有内容都写出来了,你可以改变位置来选择你想要的列名

当然,您还可以添加其他条件,以确保获得匹配的列,或按名称的列,或其他任何内容

编辑:

您询问了如何将结果查询插入表中。如果您已经有一个包含列的表准备好接收查询,那么答案很简单。。。在WHILE循环的主体中,检索所需查询后,只需添加一个INSERT命令:


有几排?性能相关吗?1300行。。而且性能可能与此无关。此外,您是否需要完全通用地使用此功能,或者您是否提前知道列名?我提前知道列名,我这样做只是为了简化我循环浏览每一列的方式。不幸的是,事实并非如此。。我有两个表,它们有相同的行和列,但一个有股票回报,另一个有每个回报的五分位数。我做了一个左连接来计算基于前五分位的平均回报,这就是为什么我要寻找一个可以遍历每一列并计算回报的函数average@RobinhoHcp这是一个完美的例子,为什么你应该阅读,当我打印它时,它可以工作,但当我执行它时,它会向我发送以下信息:名称“SELECT AVGMR.[2006-12-30]From momentary_Quintile MQ Left Join MOMENTUM_返回MQ上的MR.Mnemonic=MR.Mnemonic WHERE MQ.”不是有效标识符。嘿!你能不能给我看一下只返回一个示例的打印字符串,这样我就可以确定问题出在哪里了?从MONTORM中选择AVGMR。[2006-12-30]五分之一MQ Left Join MONTORM\u返回MQ上的MR.Mnemonic=MR.Mnemonic WHERE MQ.I添加到帖子中,这张照片也让我的答案为你提供了一个解决方案。如果还有其他问题,请告诉我。
DECLARE @TABLENAME AS VARCHAR(128);
DECLARE @COLUMN1 AS VARCHAR(128);
DECLARE @COUNTER INT;
SET @TABLENAME = 'MOMENTUM_Results';
SET @COUNTER = 1;
CREATE TABLE <mytable> (<optional_column1>,<optional_column2>,<querycolumn>);

....

WHILE ....
BEGIN

    SELECT @COLUMN1 = C.Name
    FROM sys.Columns C
    WHERE OBJECT_NAME(C.object_id) = @TABLENAME 
    AND C.column_id = @COUNTER
    ;
    SET @SQL = 'SELECT AVG(MR.[' + @COLUMN1 + ']) From MOMENTUM_Quintile MQ 
    Left Join MOMENTUM_Returns MR on MQ.Mnemonic = MR.Mnemonic WHERE MQ.[' + @COLUMN1 + '] = 1';

    INSERT INTO <mytable> (<querycolumn>) VALUES (@SQL);
    ... Other Stuff ...

    SET @COUNTER = @COUNTER + 1;