2

我想知道是否可以在 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]'year' 附近的语法不正确。

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

4

1 回答 1

3

请记住,生成的 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>

注意:这假设季度的数据类型是整数。根据需要更改cfsqltype属性。

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

于 2016-03-17T17:21:23.430 回答