Coldfusion cfchart gestapelte Reihenfolge
-
27-09-2019 - |
Frage
Ich habe ein paar Abfragen, die Daten zur Verwendung in einem Diagramm ziehen.
<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>
Der Grafik-Code ist
<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>
Das gibt mir die folgende Grafik
Wie werde ich angezeigt, um die Daten, die durch die Summe der gestapelten Elemente sortiert?
@ Ben
Das hat mich auf dem richtigen Weg, i did not vorher weiß QOQ 2 völlig verschiedene Abfragen kombinieren könnte
<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>
Lösung
Der einfachste Weg wäre, eine QofQ zu verwenden:
<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>
Ich habe nicht getestet, so müssen Sie kann es ein wenig zwicken.
Nun sollten Sie in der Lage sein, die beiden Verweise Spalten wie die Datenspalten für das Graphen zu verwenden.
Andere Tipps
hinzufügen Vielleicht Zwischen QoQ mit Filtern nur nach Datum? So etwas wie diese (nicht testen kann, so kann es einige Korrekturen müssen):
<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>
Nach dieser Aktualisierung Ihrer Anfragen bestehenden aufzunehmen wählen Sie aus clusterCombinedReferrals
und Bestellung von totalMsgCount
an erster Stelle, auch die Filterung nach Datum fallen, da sie bereits angewandt wird.
Ich glaube nicht, Sie können, ohne zuerst die Anfragen an eine Struktur ausgibt und dann das Sortieren und Ausgeben der Daten aus, dass mit dem cfchartdata-Tag in jeder cfchartseries.
So etwas, vielleicht. Ich tat dies vor Ort und es hat funktioniert, aber dann habe ich versucht, den Code an der Arbeit mit Ihren Fragen und Spaltennamen zu konvertieren, so könnte es nicht eine gerade Kopie abarbeiten und einfügen. (Aber es könnte!) Es geht auch davon aus, dass die Länge der beiden Abfragen wird immer das gleiche sein. Wenn das nicht wahr ist, könnte man um die zu Code benötigen.
<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>