2

SQLステートメント内でループできるかどうか疑問に思っていました。私の場合、テスト目的で作成した 2 年がありました。2 つ以上のレコードを持つことができるので、年を動的に作成したいと思います。テスト目的で使用したコードは次のとおりです。

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

今、私は2015年、2016年、2017年などの年を与えるcfloopを持っています...だから私はこのようなことを試みましたが、うまくいきませんでした:

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 Driver][SQLServer]「年」付近の構文が正しくありません。

これが最善の方法であるかどうかはわかりません。誰かが助けてくれるなら、私に知らせてください。

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 に答える