T-SQL |如何在While循环中为变量动态设置值

T-SQL |如何在While循环中为变量动态设置值,sql,tsql,Sql,Tsql,我有12个变量,它们都有相同的SELECT语句exept for 1 Param。我不知怎么搞不懂如何动态地完成它 以下是我的一个例子: // 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 = (SEL

我有12个变量,它们都有相同的SELECT语句exept for 1 Param。我不知怎么搞不懂如何动态地完成它

以下是我的一个例子:

// 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)

表Cols是受限的(没有更改表的权限),因此我需要这样分配它。

我认为您不需要在这里使用变量:

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;

然而,这里条件聚合就足够了,因为只有12个月。因此,不需要动态方法

我认为您不需要在这里使用变量:

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;

然而,这里条件聚合就足够了,因为只有12个月。因此,不需要动态方法

这就是你可以在这里尝试的:

声明一个包含两列的表变量

 declare @mytable table(
   VariableName varchar(255),
   VariableValue int
 )
现在声明另外两个变量,一个用于设置值,另一个用于循环迭代

 Declare @value int;
 Declare @month int = 1;
现在按如下方式执行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

这就是你可以在这里尝试的:

声明一个包含两列的表变量

 declare @mytable table(
   VariableName varchar(255),
   VariableValue int
 )
现在声明另外两个变量,一个用于设置值,另一个用于循环迭代

 Declare @value int;
 Declare @month int = 1;
现在按如下方式执行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

这看起来应该是一个

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
我认为我们必须“预先聚合”子查询中的数据,因为
COUNT(*)
PIVOT
第1条中是不允许的。请注意,每个
MonthCol
都有一个
Cnt
值,因此我们可以使用
PIVOT
中的任何聚合,该聚合返回一个未更改的输入-
SUM
MIN
MAX
。我随意选择了上面的
SUM



1您必须为聚合提供特定的列。

这看起来应该是一个
枢轴

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
我认为我们必须“预先聚合”子查询中的数据,因为
COUNT(*)
PIVOT
第1条中是不允许的。请注意,每个
MonthCol
都有一个
Cnt
值,因此我们可以使用
PIVOT
中的任何聚合,该聚合返回一个未更改的输入-
SUM
MIN
MAX
。我随意选择了上面的
SUM



1您必须为聚合提供特定列。

1。这就是我需要的。提到的其他解决方案也在发挥作用。但这是我真正想要的。谢谢编辑:谢谢你解释它是如何工作的。该死。这就是我需要的。提到的其他解决方案也在发挥作用。但这是我真正想要的。谢谢编辑:谢谢你解释它是如何工作的。