5

次の 2 つのステートメントを実行しています。

最初は A) で、必要なことを実行して機能します。

SELECT
  itemColumn
 ,valueColumn
 ,label
 FROM
 rstCombinedChartData

 UNION ALL

 SELECT
 itemColumn
 ,CAST(valueColumn AS INTEGER) AS valueColumn
 ,label
 FROM
 rstChartData  

これにより、次の結果が得られます。

ここに画像の説明を入力

次に、これらの結果を取得し、各値の itemcolumn の合計を取得する必要があります。この場合は yes と no です。

i.e.
Yes 200
No 400 

B)これは、これを達成するために私が持っているクエリです:

SELECT
itemColumn
,SUM(valueColumn) AS valueColumn
,label
FROM
rstCombinedChartData (this is above result set)
GROUP BY
label
,itemColumn
ORDER BY
label DESC
,itemColumn DESC

ただし、正しくない次の結果が得られます。

ここに画像の説明を入力

ここでクエリ B で何が起こっているのか、yes = x と no = x である必要があります。代わりに、false とすべての合計を取得していますか?

CF関数:

    <cffunction name="getAverageChartData" hint="I return the data required to render an average chart." returntype="array" output="false">
        <cfargument name="surveyList" hint="I am a record set of Surveys." required="true" type="query" />
        <cfargument name="filter" hint="I am the optional filter which is to be applied to all results." required="false" default="" type="string" />

        <cfset var local=structNew() />

        <cfset var rstChartData="" />
        <cfset var rstChartDataTotal="" />
        <cfset var rstCombinedChartData=queryNew("itemColumn,valueColumn,label","varchar,integer,varchar") />

        <cfset local.objQuestion=objQuestionService.get(arguments.surveyList.question_ID[1]) />
        <cfset local.intQuestionTypeID = local.objQuestion.getTypeID() />

        <cfset local.strSubQuestionList=local.objQuestion.getAnswer() />
        <cfset local.strPossibleAnswerList=local.objQuestion.getPossibleAnswer() />

        <cfset local.arrChartDataResult=arrayNew(1) />

<!--- loop over each school's survey --->
        <cfloop query="arguments.surveyList">
            <cfset local.arrChartData = getChartData(arguments.surveyList.survey_id, arguments.surveyList.question_id, arguments.filter) />

<!--- loop over each sub question and append (union) it to a running total --->
            <cfloop array="#local.arrChartData#" index="rstChartData">
                <cfquery name="rstCombinedChartData" dbtype="query">
                    SELECT
                         itemColumn
                        ,valueColumn
                        ,label
                    FROM
                        rstCombinedChartData

                    UNION ALL

                    SELECT
                         itemColumn
                        ,CAST(valueColumn AS INTEGER) AS valueColumn
                        ,label
                    FROM
                        rstChartData
                </cfquery>
            </cfloop>
        </cfloop>


<!--- get the totals for each itemColumn --->
            <cfquery name="rstChartDataTotal" dbtype="query">
                SELECT
                     itemColumn
                    ,SUM(valueColumn) AS valueColumn
                    ,label
                FROM
                    rstCombinedChartData
                GROUP BY
                     label
                    ,itemColumn
                ORDER BY
                     label DESC
                    ,itemColumn DESC
            </cfquery>

OK - 主要な更新

理由はわかりませんが、誤って次の行を追加しました。

<cfset querySetCell(rstCombinedChartData, "itemColumn", "1") />

突然、Railo でクエリが機能するようになりました。さて、意味のない「1」以外の結果がもう 1 つありますが、WTF です! Railo はすべての yes, no の回答が気に入らないようです。何か他のものをミックスに入れると、varchar が本来あるべきように、再び正しく処理を開始します。

ここで何が起こっているか知っている人はいますか?SQLでvarcharとしてキャストするのにうんざりしていますが、これはCFレベルでのみ機能せず、何かが起こります。

ここに画像の説明を入力

私が行を取り出す場合:

<cfset querySetCell(rstCombinedChartData, "itemColumn", "1") />

次のように戻ります。

ここに画像の説明を入力

4

3 に答える 3

3

コメントから-すでに整数であるのにvalueColumn、行の整数としてキャストする必要があったのはなぜですか?CAST(valueColumn AS INTEGER) AS valueColumn

itemColumn同じ SQL ステートメントでyour を char としてキャストしてみてください。注: MySQL では VARCHAR にキャストできません。MySQL では、CHAR を使用する必要があります。のようなものCAST(itemColumn AS CHAR) AS itemColumn

これの残りは実際には答えではありませんが、コメントするには長すぎました

共有されたデータに基づいて自己完結型の再現を作成しましたが、失敗することはありません。あなたのクエリは、ACF と Railo で正しく機能します。以下のコードをコピーしてcflive.netに貼り付けます。

<cftry>
<cfset rstCombinedChartData = QueryNew("itemColumn,valueColumn,label","varchar,integer,varchar") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "Yes") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 33) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "No") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 45) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "Yes") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 0) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "No") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 0) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "Yes") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 72) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "No") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 66) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "Yes") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 0) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "No") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 0) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "Yes") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 42) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "No") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 38) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "Yes") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 64) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "No") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 83) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "Yes") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 0) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "No") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 0) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "Yes") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 65) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "No") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 43) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "Yes") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 0) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfset temp = QueryAddRow(rstCombinedChartData) />
<cfset temp = QuerySetCell(rstCombinedChartData, "itemColumn", "No") />
<cfset temp = QuerySetCell(rstCombinedChartData, "valueColumn", 0) />
<cfset temp = QuerySetCell(rstCombinedChartData, "label", "") />
<cfquery name="rstChartDataTotal" dbtype="query">
    SELECT
        itemColumn
        ,SUM(valueColumn) AS valueColumn
        ,label
    FROM
        rstCombinedChartData
    GROUP BY
        label
        ,itemColumn
    ORDER BY
        label DESC
        ,itemColumn DESC
</cfquery>
<html>
    <head><title>Test</title></head>
    <body>
        <h3>Test</h3>
        <div>
            <cfoutput query="rstChartDataTotal">
            <p>#rstChartDataTotal.itemColumn# - #rstChartDataTotal.valueColumn#</p>
            </cfoutput>
            <cfdump var="#rstCombinedChartData#" label="rstCombinedChartData" />
            <hr />
            <cfdump var="#rstChartDataTotal#" label="rstChartDataTotal" />
        </div>
    </body>
</html>
<cfcatch type="any">
    <cfdump var="#cfcatch#" />
</cfcatch>
</cftry>

Railo が をvarchar として維持し、「はい」または「いいえ」を表示していることcfdumpを結果で確認できます。rstChartDataTotalitemColumn

ライロ ダンプ

Adobe ColdFusion では、itemColumnをブール値に変更し、「true」または「false」として表示します。

ACF ダンプ

異常はcflive.netで生成された出力からのみ発生していると思いますが、どちらの場合でもクエリは実行され、両方の列の結果が正しく計算されましたか?

于 2013-09-19T13:11:00.147 に答える
2

これはスコープ/参照の問題である可能性があります。

変化する:

<cfquery name="rstCombinedChartData" dbtype="query">

の中へ

<cfquery name="local.q" dbtype="query">

次に、QoQ の後、local.arrChartData ループの最後で、それを rstCombinedChartData 変数に戻します。

        <cfloop array="#local.arrChartData#" index="rstChartData">
            <cfquery name="local.q" dbtype="query">
                SELECT
                     itemColumn
                    ,valueColumn
                    ,label
                FROM
                    rstCombinedChartData

                UNION ALL

                SELECT
                     itemColumn
                    ,CAST(valueColumn AS INTEGER) AS valueColumn
                    ,label
                FROM
                    rstChartData
            </cfquery>
            <cfset rstCombinedChartData = local.q />
        </cfloop>
    </cfloop>

これにより、すべてのポインター/参照が正しく設定されていることが確認されます。

于 2013-09-20T11:20:59.880 に答える
0

このクエリを試してください -

SELECT UNIQUE itemColumn
      , SUM( SELECT valueColumn 
             FROM   rstCombinedChartData 
             WHERE itemColumn = "yes") as YES
      , SUM ( SELECT valueColumn 
             FROM   rstCombinedChartData 
             WHERE  itemColumn = "no") as NO
      , label;
于 2013-09-17T09:48:11.780 に答える