[英]T-SQL | How to SET Value dynamically to Variables in While Loop
I have 12 Variables and all of them have the same SELECT Statement exept for 1 Param. 我有12个变量,并且所有变量都具有相同的SELECT语句,仅用于1个Param。 I somehow cant figure out how to so it dynamically.
我不知道怎么动态地做到这一点。
Here is an example of what I have: 这是我所拥有的一个例子:
// this here should be dynamic
SET @Var1 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '1')
SET @Var2 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '2')
SET @Var3 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '3')
SET @Var4 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '4')
SET @Var5 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '5')
SET @Var6 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '6')
SET @Var7 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '7')
SET @Var9 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '8')
SET @Var9 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '9')
SET @Var10 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '10')
SET @Var11 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '11')
SET @Var12 = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = '12')
INSERT INTO VarTable (Var1, Var2, Var3, Var4, Var5, Var6, Var7, Var8, Var9, Var10, Var11, Var12)
VALUES (@Var1, @Var2, @Var3, @Var4, @Var5, @Var6, @Var7, @Var8, @Var9, @Var10, @Var11, @Var12)
The Table Cols are restricted (no permission to change the table) so I need to assign it like this. Table Cols是受限制的(无权更改表),因此我需要像这样分配它。
I think you don't need to use variable here : 我认为您不需要在这里使用变量:
INSERT INTO VarTable (Var1, Var2, Var3, Var4, Var5, Var6, Var7, Var8, Var9, Var10, Var11, Var12)
SELECT SUM(CASE WHEN MonthCol = 1 THEN 1 ELSE 0 END),
SUM(CASE WHEN MonthCol = 2 THEN 1 ELSE 0 END),
. . .
SUM(CASE WHEN MonthCol = 12 THEN 1 ELSE 0 END)
FROM #TempTable t;
However, here conditional aggregation is enough as there is only 12 months. 但是,这里有条件的聚合就足够了,因为只有12个月。 So, dynamic approach is not needed.
因此,不需要动态方法。
well this is what you can try here: 好吧,这是您可以在这里尝试的方法:
Declare a table variable with 2 columns 声明一个包含2列的表变量
declare @mytable table(
VariableName varchar(255),
VariableValue int
)
Now Declare 2 more variables, one to set value and second to iterate through loop 现在声明另外2个变量,一个用于设置值,第二个用于循环遍历
Declare @value int;
Declare @month int = 1;
Now do the while loop like this: 现在执行while循环,如下所示:
while (@month <= 12 ) --since there are only 12 months
begin
set @value = (SELECT COUNT(*) FROM #TempTable WHERE MonthCol = cast(@month as varchar));
insert into @mytable values ('Month'+cast (@month as varchar), value );
set @month = @month +1;
end
Now you'll have your DataSet in table form which you can access by using the simple query: 现在,您将以表格形式获得数据集,您可以使用简单的查询来访问它:
VariableName VariableValue
----------- --------------
Month1 23
Month2 19
Month3 66
Month4 12
Month5 05
Month6 04
Month7 63
Month8 76
Month9 21
Month10 23
Month11 63
Month12 12
Select * from @mytable where VariableName = 'Month1'
This looks like it should be a PIVOT
: 看起来应该是
PIVOT
:
INSERT INTO VarTable (Var1, Var2, Var3, Var4, Var5, Var6, Var7, Var8, Var9, Var10, Var11, Var12)
SELECT [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]
FROM (select MonthCol,COUNT(*) Cnt from #TempTable group by MonthCol) t
PIVOT (SUM(Cnt) FOR MonthCol IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) u
I believe we have to "pre-aggregate" the data in a subquery because COUNT(*)
isn't allowed in the PIVOT
clause 1 . 我相信我们必须“预聚合”子查询中的数据,因为
PIVOT
子句1中不允许COUNT(*)
。 Note that each MonthCol
will have a single Cnt
value so we could use any aggregate in the PIVOT
that returns a single input unaltered - SUM
, MIN
or MAX
. 请注意,每个
MonthCol
将有一个单一的Cnt
值,所以我们可以在使用任何集合PIVOT
返回单个输入不变- SUM
, MIN
或MAX
。 I arbitrarily picked SUM
above. 我在上面任意选择了
SUM
。
1 You have to supply specific column(s) to the aggregate. 1您必须向聚合提供特定的列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.