Транспонировать запрос в 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>

Я думаю, что вы описываете сводный запрос в SQL.

Другие вопросы по тегам