Транспонировать запрос в ColdFusion
У меня есть простой cfquery, который выводит 3 столбца с соответствующими данными. Столбцы - это имя, адрес и возраст.
Я хочу транспонировать этот набор данных, чтобы имена стали столбцами, а адрес и возраст отображались под каждым столбцом.
Я знаю, что мы можем использовать QueryAddColumn или что-то подобное для этой проблемы. Может кто-нибудь помочь мне с этой проблемой?
РЕДАКТИРОВАТЬ: Основываясь на комментарии ниже, это предполагаемый результат:
Oct 2011 Nov 2011 Dec 2011 Jan 2012 Feb 2012
NumberofPeople NumberofPeople NumberofPeople NumberofPeople NumberofPeople
EmploymentRate EmploymentRate EmploymentRate EmploymentRate EmploymentRate
3 ответа
Я включил пример строки данных вверху, куда вы бы поместили свой оператор cfquery.
<cfset firstQuery = queryNew("date,NumberofPeople,EmploymentRate")>
<cfset aRow = queryAddRow(firstQuery)>
<cfset querySetCell(firstQuery,"date","OCT_2011",aRow)>
<cfset querySetCell(firstQuery,"NumberofPeople","28",aRow)>
<cfset querySetCell(firstQuery,"EmploymentRate","50%",aRow)>
<cfset aRow = queryAddRow(firstQuery)>
<cfset querySetCell(firstQuery,"date","NOV_2011",aRow)>
<cfset querySetCell(firstQuery,"NumberofPeople","28",aRow)>
<cfset querySetCell(firstQuery,"EmploymentRate","56%",aRow)>
<cfset aRow = queryAddRow(firstQuery)>
<cfset querySetCell(firstQuery,"date","DEC_2011",aRow)>
<cfset querySetCell(firstQuery,"NumberofPeople","29",aRow)>
<cfset querySetCell(firstQuery,"EmploymentRate","55%",aRow)>
<cfset aRow = queryAddRow(firstQuery)>
<cfset querySetCell(firstQuery,"date","JAN_2012",aRow)>
<cfset querySetCell(firstQuery,"NumberofPeople","30",aRow)>
<cfset querySetCell(firstQuery,"EmploymentRate","52%",aRow)>
<!--- Will Create new query with names as column headers--->
<cfset newQuery = queryNew(valueList(firstQuery.date,','))>
<!--- Will Create new query with names as column headers--->
<cfset people = queryAddRow(newQuery)>
<cfset rate = queryAddRow(newQuery)>
<cfloop query='firstQuery'>
<!---Syntax for this function is: QuerySetCell(query, column_name, value [, row_number ]) --->
<cfset querySetCell(newQuery,firstQuery.date,firstQuery.NumberofPeople,people)>
<cfset querySetCell(newQuery,firstQuery.date,firstQuery.EmploymentRate,rate)>
</cfloop>
<cfdump var="#newQuery#">
<cfdump var="#ArrayToList(newQuery.getColumnNames())#">
Вот как я это сделаю, но я не могу понять, почему я это сделаю. Мне было бы интересно услышать ваш вариант использования. Во всяком случае, я надеюсь, что это поможет.
(PS Это проверено в CF9, поэтому вы должны быть в состоянии скопировать и вставить его для тестирования самостоятельно.)
РЕДАКТИРОВАТЬ -(снова):
Забыл упомянуть, что это может работать только в том случае, если имена, которые вы извлекаете из БД, являются допустимыми именами столбцов, поэтому пробелы отсутствуют (в этом примере пробелы в датах заменены подчеркиванием)!
>>> Новый фрагмент кода для обновленной структуры данных, функция valueList(firstQuery.date,',')
не переупорядочивает ваши столбцы. Столбцы переупорядочиваются на выходе при выгрузке. Я использовал функцию ArrayToList(newQuery.getColumnNames())
чтобы показать, что внутренне CF поддерживает порядок столбцов, и вам нужно только задать это красиво. Вы должны быть в состоянии использовать всю эту информацию, чтобы выводить ваши данные так, как вам нужно.
Может быть, я что-то упускаю, но кажется, что простой SQL-запрос с предложением ORDER BY будет работать. Что-то вроде этого:
<cfquery name="myquery" datasource="yourdatasourcename">
select name, address, age
from tablename
order by name
</cfquery>
Затем на странице вывода ColdFusion вы можете использовать тег с атрибутом group. Что-то вроде этого:
<cfoutput query="myquery">
<p>name = #name#
<cfoutput group="name">
age = #age#
address = #address#<br />
</cfoutput>
</p>
</cfoutput>
Очевидно, вы можете отформатировать вывод по своему усмотрению.
РЕДАКТИРОВАТЬ --
Если вы хотите отобразить как:
Mary Joe Sam Suzie
28 36 25 42
123 Maple 16 Oak 3723 Street 832 Busy St.
Возможно, что-то вроде (я не проверял это, просто мозговой штурм):
<cfoutput query="myquery" group="name">
<div style="float:left;">name = #name#
<cfoutput>
<p>
age = #age#<br />
address = #address#
</p>
</cfoutput>
</div>
</cfoutput>