Sql server sql语句中的Cfloop?

Sql server sql语句中的Cfloop?,sql-server,coldfusion,concat,cfloop,Sql Server,Coldfusion,Concat,Cfloop,我想知道是否有可能在sql语句内部循环。在我的例子中,我有两年的时间是为了测试而创建的。现在我想动态创建年份,因为我可以有两个以上的记录。以下是我用于测试目的的代码: Select sum(case when quarter = '2015' then 1 else 0 end) as year2015, sum(case when quarter = '2016' then 1 else 0 end) as year2016 From testTable 现在我有了cfloop

我想知道是否有可能在sql语句内部循环。在我的例子中,我有两年的时间是为了测试而创建的。现在我想动态创建年份,因为我可以有两个以上的记录。以下是我用于测试目的的代码:

Select sum(case when quarter = '2015' then 1 else 0 end) as year2015,
       sum(case when quarter = '2016' then 1 else 0 end) as year2016
From testTable
现在我有了cfloop,它给了我2015年、2016年、2017年。。。 所以我尝试了类似的方法,但没有成功:

Select 
      <cfloop from="#startYear#" to="#endYear#" step="1" index="i">
            sum(case when quarter = i then 1 else 0 end) as CONCAT('year',i)
      </cfloop>
From testTable
错误消息:

[Macromedia][SQLServer JDBC驱动程序][SQLServer]附近的语法不正确 “年”


我不确定这是否是最好的方法,如果有人可以帮助,请告诉我。

请记住,生成的SQL字符串必须有效。CF变量需要在case语句中传入

<cfquery name="foo" datasource="xxx">
    SELECT  1 AS placeholder
            <cfloop from="#startyear#" to="#endyear#" index="i">
                -- prepend comma before each statement. Also, variable i must be passed in since it exists as a CF variable, not a SQL variable.
                ,SUM(CASE WHEN quarter = <cfqueryparam value="#i#" cfsqltype="cf_sql_integer" />  THEN 1 ELSE 0 END) AS year#i#
            </cfloop>
    FROM    testTable
</cfquery>
注意:这假设quarter的数据类型为整数。根据需要更改cfsqltype属性


您还可以使用PIVOT函数来构建列

当quarter='i'时,尝试此sumcase,然后1或0结束为yeari。您还需要一个逗号,但最后一个逗号才是有效的SQL。此外,我认为您可能只需要选择countquarter作为总计,根据您期望的输出,逐季度从testTable组中选择quarter。那么,最后我应该如何处理逗号呢?如果我只有一年的时间,我就不需要逗号了,如果我有两个或更多的时间,我就不需要逗号了?我不知道这个查询应该用代码来完成。我同意John和James的观点:从本质上讲,通过数据库本身可以更容易地实现这一点。另外,上面的查询将选择数据库中的所有行,并且不会将它们限制为startyear和endyear。而quarter=2015并没有多大意义。我不确定这里的意图是什么。您可以使用SQLFIDLE或类似的工具为我们提供一个基本的数据库模式,以及您希望查询返回的内容吗?我认为任何一年返回的都不会超过1。它在1或0上运行聚合,没有任何分组,因此求和实际上没有任何作用。我不认为这里真的需要queryparam,因为循环是生成I的循环。