2010-10-03 10 views
3

J'ai quelques requêtes qui tirent des données à utiliser dans un graphique.Coldfusion cfchart empilé commande

<cfquery name='clusterPrivateReferrals' dbtype="query"> 
SELECT organisationName, count(messageID)*1000/listSize as msgCount 
FROM clusterReferrals 
WHERE datecreated>#refRateStartDate# 
AND refTypeID=3 
GROUP BY organisationName, listSize 
</cfquery> 

<cfquery name='clusterNHSReferrals' dbtype="query"> 
SELECT organisationName, count(messageID)*1000/listSize as msgCount 
FROM clusterReferrals 
WHERE datecreated>#refRateStartDate# 
AND refTypeID<>3 
GROUP BY organisationName, listSize 
</cfquery> 

Le code graphique est

<cfchart format="flash" title="Cluster referrals per 1000 patients from #dateformat(refRateStartDate, 'dd-mmm-yy')#" chartWidth="470" chartHeight="380" fontSize="12" style="chart.xml" seriesPlacement = "stacked" showLegend = "yes"> 
    <cfchartseries type="bar" seriescolor="##FFD800" seriesLabel="Private" query="clusterPrivateReferrals" valueColumn="msgCount" ItemColumn="organisationName"> 
    </cfchartseries> 
    <cfchartseries type="bar" seriescolor="##F47D30" seriesLabel="NHS" query="clusterNHSReferrals" valueColumn="msgCount" ItemColumn="organisationName"> 
    </cfchartseries> 
</cfchart> 

cela me donne le graphique suivant

alt text

Comment puis-je obtenir les données affichées triées par le total des éléments empilés?

@ Ben

Cela m'a fait sur la bonne voie, je ne savais pas auparavant QOQ pourrait combiner 2 requêtes complètement différentes

<cfquery name='clusterPrivateReferrals' dbtype="query"> 
SELECT organisationName, count(messageID)*1000/listSize as privateRate 
FROM allReferrals 
WHERE datecreated>#refRateStartDate# 
AND refTypeID=3 
GROUP BY organisationName, listSize 
</cfquery> 

<cfquery name='clusterNHSReferrals' dbtype="query"> 
SELECT organisationName, count(messageID)*1000/listSize as nhsRate 
FROM allReferrals 
WHERE datecreated>#refRateStartDate# 
AND refTypeID<>3 
GROUP BY organisationName, listSize 
</cfquery> 

<cfquery name="stackOrder" dbtype="query"> 
    select clusterPrivateReferrals.privateRate, 
     clusterNHSReferrals.nhsRate, 
     clusterPrivateReferrals.organisationName, 
     (clusterPrivateReferrals.privateRate + clusterNHSReferrals.nhsRate) as totalRate 
    from clusterPrivateReferrals, clusterNHSReferrals 
    WHERE clusterNHSReferrals.organisationName = clusterPrivateReferrals.organisationName 
    order by totalRate desc 
</cfquery> 

Répondre

2

La façon la plus simple serait d'utiliser un QofQ:

<cfquery name="stackOrder" dbtype="query"> 
    select clusterPrivateReferrals.msgCount as privateReferrals, 
     clusterNHSReferrals.msgCount as NHSReferrals, 
     clusterPrivateReferrals.organizationName 
    from clusterPrivateReferrals 
    join clusterNHSReferrals on clusterNHSReferrals.organizationName = clusterPrivateReferrals.organizationName 
    order by (privateReferrals+privateReferrals) desc 
</cfquery> 

Je n'ai pas testé, donc vous devrez peut-être modifier un peu. Maintenant, vous devriez pouvoir utiliser les deux colonnes Referrals comme colonnes de données pour le graphique.

+0

Je ne savais pas que vous pouviez faire ce genre de chose dans un QoQ mais maintenant que je le vois, je ne vois pas pourquoi il ne serait pas t travail. Pour une raison quelconque, j'avais dans ma tête que vous pouviez faire un QoQ avec une seule requête d'origine. – Jason

+1

J'ai utilisé QofQ pour joindre des données provenant d'autres sources de données auparavant. C'est plus pratique que ce que les gens ont tendance à croire. –

+0

Cela fait presque Ben, et m'a mis sur la bonne voie. Voir ci-dessus pour le code de travail. – Saul

0

Peut-être ajouter en glissement trimestriel intermédiaire avec filtrage seulement par date? Quelque chose comme ça (ne peut pas tester, donc il peut avoir besoin des correctifs):

<cfquery name='clusterCombinedReferrals' dbtype="query"> 
SELECT organisationName, messageID, listSize, count(messageID)*1000/listSize as totalMsgCount 
FROM clusterReferrals 
WHERE datecreated>#refRateStartDate# 
GROUP BY organisationName, listSize 
</cfquery> 

Après cette mise à jour de vos requêtes existantes pour inclure sélection de clusterCombinedReferrals et de l'ordre par totalMsgCount à la première place, déposer également le filtrage par date comme déjà appliqué.

0

Je ne pense pas que vous le pouvez sans d'abord sortir les requêtes à une structure, puis de le trier et de sortir les données de cela avec la balise cfchartdata dans chaque cfchartseries.

Quelque chose comme ça, peut-être. Je l'ai fait localement et cela a fonctionné, mais j'ai ensuite essayé de convertir le code pour qu'il fonctionne avec vos requêtes et vos noms de colonnes, de sorte qu'il pourrait ne pas fonctionner à partir d'une copie directe et coller. (Mais il pourrait!) Il suppose également que la longueur des deux requêtes sera toujours la même. Si ce n'est pas vrai, vous devrez peut-être coder autour de cela.

<cfset data = {}> 

<cfloop from="1" to="#clusterPrivateReferrals.recordCount#" index="x"> 

    <cfset structInsert(data, clusterPrivateReferrals["organisationName"][x], {})> 

    <cfset data['#clusterPrivateReferrals["organisationName"][x]#'].private = clusterPrivateReferrals["msgCount"][x]> 

    <cfset data['#clusterNHSReferrals["organisationName"][x]#'].nhs = clusterPrivateReferrals["msgCount"][x]> 

    <cfset data['#clusterPrivateReferrals["organisationName"][x]#'].total = data['#clusterNHSReferrals["organisationName"][x]#'].private + data['#clusterNHSReferrals["organisationName"][x]#'].nhs> 

</cfloop> 

<cfset sorted = structSort(data, "numeric", "desc", "total")> 

<cfchart format="flash" title="data" chartWidth="470" chartHeight="380" fontSize="12" seriesPlacement = "stacked" showLegend = "yes"> 

    <cfchartseries type="bar" seriescolor="##FFD800" seriesLabel="Private"> 
     <cfloop from="1" to="#arrayLen(datas)#" index="x"> 
      <cfchartdata item="#sorted[x]#" value="#data['#sorted[x]#'].private#"> 
     </cfloop> 
    </cfchartseries> 

    <cfchartseries type="bar" seriescolor="##F47D30" seriesLabel="NHS"> 
     <cfloop from="1" to="#arrayLen(datas)#" index="x"> 
      <cfchartdata item="#sorted[x]#" value="#data['#sorted[x]#'].nhs#"> 
     </cfloop> 
    </cfchartseries> 

</cfchart> 
+0

Oui, mettre dans les tableaux fonctionnerait, mais la solution QOQ de Ben ci-dessus est plus lisse – Saul

Questions connexes