1

それぞれのデータを含む3つの列を出力する単純なcfqueryがあります。列は名前、住所、年齢です。

このデータセットを転置して、名前が列になり、住所と年齢が各列の下に表示されるようにします。

この問題には、QueryAddColumnなどを使用できることを知っています。誰かがこの問題で私を助けることができますか?

編集:以下のコメントに基づいて、これは意図された出力です:

Oct 2011          Nov 2011          Dec 2011          Jan 2012          Feb 2012
NumberofPeople    NumberofPeople    NumberofPeople    NumberofPeople    NumberofPeople
EmploymentRate    EmploymentRate    EmploymentRate    EmploymentRate    EmploymentRate
4

3 に答える 3

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でテストされているため、コピーして貼り付けて自分でテストできるはずです。)

編集-(再び)::

言及するのを忘れて、これはDBから取得する名前が有効な列名である場合にのみ機能するため、スペースはありません(この例では、日付のスペースはアンダースコアに置き換えられています)。

>>>更新されたデータ構造の新しいコードスニペット。関数valueList(firstQuery.date,',')は列を並べ替えません。ダンプ時に、出力時に列の順序が変更されます。この関数ArrayToList(newQuery.getColumnNames())を使用して、CFが列の順序を内部的に維持していることを示しましたが、適切に質問するだけで済みます。このすべての情報を使用して、必要な方法でデータを適切に出力できるはずです。

于 2012-09-11T13:58:42.833 に答える
1

何かが足りないかもしれませんが、ORDERBY句を使用した単純なSQLクエリが機能するようです。このようなもの:

<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>
于 2012-09-11T13:23:09.980 に答える
0

SQLでピボットクエリを記述していると思います。

于 2012-09-12T03:39:09.313 に答える