2016-03-17 1 views
2

Мне было интересно, можно ли зацикливать внутри оператора sql. В моем случае у меня было два года, которые я создал для тестирования. Теперь я хочу динамически создавать годы, потому что у меня может быть более двух записей. Вот мой код, который я использовал для целей тестирования: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 Driver] [SQLServer] Неправильный синтаксис около 'год'.

Я не уверен, что это лучший способ сделать это, если кто-нибудь может помочь, пожалуйста, дайте мне знать.

+1

попробуйте эту 'sum (case when quarter = '# i #' then 1 else 0 end) в качестве года # i #'. Вам также понадобится запятая, но последняя будет действительной SQL. Также я думаю, что вы можете просто «подсчитать количество (квартал) как итог, квартал от группы testTable по кварталу» в зависимости от того, какой результат вы ожидаете. –

+0

Так что и как я должен обрабатывать запятую на конце? Если у меня есть только один год, мне не понадобится запятая, если у меня есть 2 и более, мне нужно? –

+1

Не думайте что-нибудь для PIVOT или UNPIVOT? –

ответ

3

Просто помните, что ваша результирующая строка SQL должна быть действительной. Переменные CF должны быть переданы в вашем случае.

<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 для построения своих столбцов.

+0

Я не думаю, что это вернет более 1 в любой год. Он выполняет агрегат на 1 или 0 без какой-либо группировки, поэтому sum() на самом деле ничего не делает. И я не думаю, что queryparam действительно необходим здесь, так как цикл является тем, который генерирует i. – Shawn

 Смежные вопросы

  • Нет связанных вопросов^_^