Coldfusion cfchart Stacked порядок
-
27-09-2019 - |
Вопрос
У меня есть пара запросов, которые тянут данные для использования в графике.
<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>
Код графика
<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>
Это дает мне следующий график
Как получить данные, отображаемые отсортированными по всемую сложенным элементам?
@ Бен
Что получил меня на правильном пути, я ранее не знал, что Qoq может сочетать 2 совершенно разных запроса
<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>
Решение
Самый простой способ было бы использовать 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>
Я не проверил это, поэтому вам может понадобиться немного настроить его.
Теперь вы должны быть в состоянии использовать две столбцы рефералов в качестве столбцов данных для графика.
Другие советы
Возможно добавить промежуточный qoq с фильтрацией только по дате? Что-то вроде этого (не может проверить, поэтому может понадобиться некоторые исправления):
<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>
После этого обновить ваши существующие запросы, чтобы включить выбор из clusterCombinedReferrals
и заказать totalMsgCount
На первом месте также отбросьте фильтрацию по дате, как уже применимо.
Я не думаю, что вы можете, не сначала выводит запросы к структуре, а затем сортируя его и выводит данные с тегом CFChartdata внутри каждого CFCHARTSERIES.
Может быть, что-то вроде. Я сделал это локально, и это сработало, но потом пытался преобразовать код для работы с вашими запросами и именами столбцов, поэтому он не может работать с прямой копией и вставки. (Но это может!) Это также предполагает, что длина двух запросов всегда будут одинаковыми. Если это не так, вам может потребоваться кодировать вокруг этого.
<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>