mysql - 如何减少每个月的查询次数

标签 mysql coldfusion cfml coldfusion-11

我正在使用 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>

这些查询的结果 Query Results

为了获取每个月的记录,我编写了一个查询,如下所示。

获取当前月份

<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/

相关文章:

mysql - 使用 SQLyog 导出 MySQL 所有数据库会产生调用者/定义者权限错误

sql - CF 查询似乎从文本字段返回不完整的数据

coldfusion - 我可以在ColdFusion中按索引获取查询吗?

mysql - 每个用户保存相似记录的单个表还是单独的表? (表现??)

java - 如何从字符串中删除某些特定单词并将其存储在临时变量中并将该变量发送到我的查询

php - 通过 php 将数据插入 MySQL,并指定过期日期

web-services - 复杂数据类型的 Coldfusion Webservice 错误

arrays - 二维 ColdFusion 结构

coldfusion - 在 Coldfusion 中为 Google 服务帐户创建 JWT

coldfusion - 将 ColdFusion 日期转换为 Unix 时间戳