我正在使用 My Sql 5.7 和 CF11。我想从下面的查询中获取每个月的总 qTotalPrice 和 quoteKeyID。但不是一整年。我想获取从当月到最近六个月的数据(从七月到二月)。如果特定月份没有数据,我需要将该特定月份显示为 0。
<cfquery name="thisYearsQuotes" datasource="myDB">
SELECT * , MONTH(qDateTime) as qMonth
FROM Quotes
INNER JOIN Accounts
ON Quotes.aID = Accounts.aID
WHERE Accounts.aID = <cfqueryparam value="#VNAI.aID#" cfsqltype="cf_sql_clob" maxlength="255">
AND Quotes.qDateTime > DATE_ADD(NOW(), INTERVAL -365 DAY)
</cfquery>
为了获取每个月的记录,我编写了一个查询,如下所示。
获取当前月份
<cfquery name="SalesTotalThisMonth" dbtype="query">
SELECT SUM(qTotalPrice) as DollarTotal , COUNT(quoteKeyID) as QuoteCount
FROM thisYearsQuotes
WHERE qMonth = #MONTH(NOW())#
</cfquery>
恢复一个月
<cfquery name="SalesTotal1MonthAgo" dbtype="query">
SELECT SUM(qTotalPrice) as DollarTotal , COUNT(quoteKeyID) as QuoteCount
FROM thisYearsQuotes
WHERE qMonth = #MONTH(DateAdd("m",-1,NOW()))#
</cfquery>
为了获得两个月的返回,
<cfquery name="SalesTotal2MonthAgo" dbtype="query">
SELECT SUM(qTotalPrice) as DollarTotal , COUNT(quoteKeyID) as QuoteCount
FROM thisYearsQuotes
WHERE qMonth = #MONTH(DateAdd("m",-2,NOW()))#
</cfquery>
等等...同样,我必须坚持最后六个月。所以我每个月都写了一些查询的查询。
有没有可能减少代码?
最佳答案
更新
解决方案是为您需要的所有月份创建一个查询,然后使用左联接。
SELECT 8 AS MonthNum UNION SELECT 7 AS m UNION SELECT 6 AS m UNION SELECT 5 AS m UNION SELECT 4 AS m UNION SELECT 3 AS m
为了使其自动化,我添加了一些 CF 代码来创建上述查询。
<cfset today=now()>
<cfset start = 0>
<cfset numberOfMonths = 6>
<cfset listOfMonths = ''>
<cfloop condition="numberOfMonths+start GT 0">
<cfset listOfMonths = listappend(listOfMonths, ' SELECT ' & Month(DateAdd('m', start, today)) & ' AS m ')>
<cfset start-->
</cfloop>
<cfoutput>
<cfquery>
SELECT SUM(O.order_Total) AS totalOrder, COUNT(O.order_ID) AS numOrders, MONTH(O.order_Date) AS qMonth
FROM tbl_orders O
RIGHT JOIN (
#ListChangeDelims(listOfMonths, 'UNION')#
) monthList ON monthList.m = MONTH(O.order_Date) AND O.order_Date > DATE_ADD(NOW(), INTERVAL -6 MONTH)
GROUP BY qMonth;
</cfquery>
<cfoutput>
初始
我认为您可以使用适当的group by
在单个查询中完成此操作。
<cfquery name="thisYearsQuotesPerMonth" datasource="mySQL_MILESTONEBMDB">
SELECT
SUM(qTotalPrice) AS DollarTotal, COUNT(quoteKeyID) AS QuoteCount, MONTH(qDateTime) as qMonth
FROM
Quotes
INNER JOIN Accounts ON Quotes.aID = Accounts.aID
WHERE
Accounts.aID = <cfqueryparam value="#VNAI.aID#" cfsqltype="cf_sql_clob" maxlength="255">
AND Quotes.qDateTime > DATE_ADD(NOW(), INTERVAL -6 MONTH)
GROUP BY qMonth
</cfquery>
关于mysql - 如何减少每个月的查询次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51614389/